Facade
Facadeは、複数の型やサブシステムから成る機能へ、利用側の目的に合った高水準の入口を提供します。下位機能を利用禁止にするものではなく、よく使う処理を安定した契約でまとめる手法です。
採用する場面
- 一つの利用者操作を完了するために、複数の下位機能を決まった順序で呼ぶ
- サブシステムの初期化や利用手順が複雑で、複数の呼び出し側に重複している
- 下位ライブラリの変更から、上位の利用コードを保護したい
- 外部へ公開するAPIを、内部構造より小さく安定させたい
一つの関数をそのまま呼べる場合や、単に名前を変えるだけの場合はFacadeを作りません。関連の薄い操作を一つの巨大なServiceへ集めることもFacadeではありません。
実装方針
- 利用者の目的をメソッド名と入出力で表し、下位APIをそのまま写さない
- transaction、部分失敗、再試行、補償処理の境界を明示する
- 認証・認可、ログ、キャッシュを「横断的だから」という理由だけで無条件に集約しない
- 利用側が必要な詳細まで隠して、回復や性能判断を不可能にしない
- Facadeが成長し続ける場合は、異なる利用目的が混ざっていないか分割する
Application Serviceが一つのユースケースを調整する場合、結果としてFacadeに似た入口になることがあります。ただし、パターン名よりtransactionと業務上の責務を優先します。