12
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

マンガでわかる Facade

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

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

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

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

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

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

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
12
Help us understand the problem. What are the problem?