白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

Facadeパターンはファサードなんだろうか

こんにちは。
ぼちぼち、新年度の足音が聞こえてきますね。

さて、タイトルなんですが、前からずっともやもやしてることです。
別にFacadeパターンをやめろとか名前を変えろとかそういう話じゃないんですが、なんか自分の思うファサードとちょっと違うんだよなって思ってる話。

ファサードってなんだ

ja.wikipedia.org

例によってWikipediaを見ていくんですが、「建築物正面のデザインを指す語句」とあります。
建築においての「正面」は基本的に町(都市)や街路に対しての正面と解釈するのが良いかと思います。
複数面のファサードを持つ場合もありますし、極端な地下に埋まっている構造物のようにファサードを持たないものもあります。(地下は必ずファサードを持たないかというと、駅ビルの地下街に対するファサードとかまぁそういうのはあるとは思いますが)

Facadeパターンってなんだ

ja.wikipedia.org

FacadeパターンはおなじみGoFデザインパターンの一つです。

異なるサブシステムを単純な操作だけを持ったFacadeクラスで結び、サブシステム間の独立性を高める事を目的とする。

とありますね。

Facade(ファサード)とは「建物の正面」を意味する。

ともあり、建築用語としてのファサードを由来としていそうなことがわかります。

余談ですが、そもそもGoFデザインパターン自体がクリストファー・アレグザンダーという建築家が提唱したパタン・ランゲージという理論から発想を得ています。(この本めちゃくちゃ高いですが、なかなか面白いです)

微妙なズレ

個人的な感覚としては建築という3次元の構造物をとある方向(意図的に見せようとしている方向)から2次元の面として捉えたものがファサードだと思っています。
それこそハリボテのようにファサードを独立した構造物のように作ることもできなくはないですが、映画のセットでもなければあんまり一般的ではないかなと…。(都市によってはファサードに統一感を求めるため、ファサードと背後の本来の構造物の様式が異なるなんてこともありますが)

一方でFacadeパターンではFacadeクラスと言っているように、ファサード自体を独立したモノとしてみなすことが一般的です。
裏側にある機能にアクセスするための受付や窓口的な役割です。面というよりは点という感じですね。
おそらくオフィスビルモデリングしてFacadeパターンを適用してくださいと言ったら、受付にあたる機能をFacadeクラスとして置くのではないでしょうか。

もう一回振り返ってみますが、ファサードは「建築物正面のデザインを指す語句」です。機能ではなくデザインです。なので特に集約するというニュアンスはありません。
「正面」という言葉から「見せ方」をソフトウェアの概念に落とし込んだらそうなったのかもしれないですが、だとするとインタフェースのほうが近くないですかね。
facadeはフランス語の顔っていう意味なので、英語のfaceと同義です。interfaceってまさにfaceって付いてるし。
じゃあ今のFacadeパターンは何なのっていうと、Reception(受付)パターン…とかですかね。

このズレが「まぁそりゃそうなんだけどさ」という話なのか、「いやそういう捉え方じゃないんだよ」という話なのかはよくわからないです。
いやまぁ、一般的なパターンなんで使いますけどね…。