41
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ちょうぜつAdvent Calendar 2019

Day 10

マンガでわかる Facade

Last updated at Posted at 2019-12-10

22AF0B0A-38AD-4FCD-A9F6-DF999F159297.png

みんなそれぞれ得意な技術を持ったすごいエンジニアなんだけど、いっぺんに全員来るとわけがわからないですね。まずは上司のこみっとさんを通してからにしましょう。

複数のオブジェクトの連携でひとつの大きな問題に対処する必要があるとき、問題解決の責務を持つオブジェクトが各オブジェクトと直接関係を持ってしまうと、本当にやりたいことの知識と、誰に何を頼むのかのコントロールが混ざってしまいます。やはり関心の分離が重要です。

Facade 役のオブジェクトには、やりたいことの実現に応答できるプリミティブな語彙だけを設けます。問題そのものには踏み込みません。なるべく素朴に、複数の実機能オブジェクトのへ委譲コントロールし、連携の複雑さだけをラップします。

そうすると、問題そのものに調整が必要になっても、変更は Facade を使うオブジェクトにしか発生しません。Facade そのものには、問題解決の知識はないのですから。

また、実現機能の側に変更が必要になった場合は、コール側の変更をいっさいせずに、その内部の連携コントロールだけを変更すれば済むようになります。つまり、オブジェクト指向の基礎の基礎、カプセル化 = 抽象によって詳細が隠蔽されている、ということです。(abstract class を使うかどうかだけが抽象か否かを決めるわけではありません)

AdapterDecorator パターンなどの、単一のオブジェクト関係に着目したものと異なり、Facade は複数のオブジェクトを集約するラッパークラスです。

ラッパークラスのメソッドが、つねにひとつの内部オブジェクトに 1:1 でマップされる場合、それがいくら矢面に立つ受付であっても、それは Adapter です。

(PHP のフレームワーク Laravel の機能に、デザインパターンとは無関係な Facade と名付けられたものがあります。前述の意味で、Facade パターンとは異なり、むしろデザインパターンでは Adapter なので注意してください)

41
15
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?