はじめに
変更しやすいコードが書けないのにソフトウェア開発とか舐めているのですか
天使様1ごめんなさい〜、nikkieです。
「かわいい」と技術書が夢の合体を果たした、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)!🤗
読書会を共同主催しており、第8章「デザインパターン」を読み進めています。
直近の読書会(開催済み)の範囲のFacadeについて取り上げます。
目次
前回のちょうぜつ本!
きっかけは、いわしまんさんの書評エントリ。
読書会で前から順に読み進めて第8章に突入!
範囲を細かくしてじっくりと読み進めています。
- 読書&写経ログ | #ちょうぜつ本 第8章 Bridgeパターン 〜has-a関係でとらえて、複数系統の組合せを表現できる!〜 - nikkie-ftnextの日記
- 読書ログ | #ちょうぜつ本 (第8章)でも #fukabori (48)でも、ただしSingleton、テメーはダメだ - nikkie-ftnextの日記
それではFacadeパターン、いってみましょー!
Facade
複数のオブジェクトで構造を作るときのデザインパターンを紹介する8-5より。
機能群の利用者に唯一のFacadeだけを通してアクセスしてもらうことで、機能群とその利用者との関係がシンプルになります。(Kindle版 p.362)
みんな「表玄関」通ってね
ちょうぜつ本きっかけに手元のウィズダム英和辞典でfacadeを引くと
(建物の堂々とした)正面, 前面, ファサード.
たしかに表玄関だ!
表玄関を提供することで可能になるのが以下
- システムの個々の部品を全員が使いこなさなくてもよくなる
- 利用者にはFacadeしか見えないので、裏側をリファクタリングし放題
- 表玄関だけを通るようにした効果
IMO:Facadeで正しい使い方を簡単にできそう!
上の1点目についてもう少し。
私はシンプルな設計を志向しており、おのずと小さな部品を組み合わせることになります。
組み合わせて複雑な機能を実現できるのがとっても好みなのですが、使う人が増えてくると全員が使いこなせるわけではないという課題も生じてくるかなと思います。
ここでFacadeを使って、部品群をまとめあげるのがいいのではないかと現時点では考えています。
好きなきのこ2の「正しい使い方を簡単に、誤った使い方を困難に」の実現に役立つと見ています
なじみのあったFacade
見かけたり自分でも作ろうとしてみたりしていたので、馴染みがありました。
『Python実践入門』より、LGTM画像生成コマンドラインツールの実装(13章)から
lgtm/image_source.pyのユーザーには、どのイメージソースクラスが利用されているかを意識して欲しくありません。そこで、get_image()関数を用意します。
これはFacade(表玄関)だと思います。
なお、get_image()関数がラップしているImageSource
関数(クラスに見せた関数!)というのもなるほどでした。
もう1つ、機械学習システムデザインパターンでもFacade的な構成要素が登場しています。
例えば、条件分岐推論パターン
Proxy ServerがFacadeだと思います。
この裏には複数のAPI(機械学習モデルをサーブ)があるのですが、クライアントはProxy Serverを叩くだけで裏側のAPIの詳細は一切知らなくて済みます。
(※このあとちょうぜつ本でProxyパターンを読むので、理解が変わるかもしれません)
余談:細かすぎて伝わらないちょうぜつ本見どころ #0
出版後のPHP勉強会より
/
LaravelのFacadeは1:1
\
(Laravelは色々と開発者コミュニティへの貢献があると思いますが)1:1でFacadeを持ち込んでも表玄関の意味はないですよね
用語は意味わかって踏襲しろ (1:03:54)
なお、LaravelのFacadeが動く仕組みは、Kanonさんによるこちらのソースコードリーディング3が分かりやすかったです。
Facade は基本的には DI のためのコードのシンタックスシュガー。
ただし実質シングルトンとしてインスタンスを取得し、処理を実行し、結果を返すもの。
終わりに
ちょうぜつ本 8章よりFacadeパターンでした。
表玄関を提供して
- 利用者が理解すべきものを表玄関1つだけと簡単にできる
- 表玄関しか見えないのでその裏側はガンガンリファクタリングできる
わけです。
ソフトウェア構造にはよく眠っているそうで、見つけて鑑賞したり、実装で試してみたりしていきたいですね。
ちなみに私は、ファサードという音のファサーが好きです!
- ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です↩
- エッセイ集『プログラマが知るべき97のこと』↩
- 後続の Laravel considered harmful 〜SOLID原則にそぐわないLaravelのイマイチな習慣〜 で回収されていました↩