Interactive

Facade

Facadeは、複数の型やサブシステムから成る機能へ、利用側の目的に合った高水準の入口を提供します。下位機能を利用禁止にするものではなく、よく使う処理を安定した契約でまとめる手法です。

採用する場面

  • 一つの利用者操作を完了するために、複数の下位機能を決まった順序で呼ぶ
  • サブシステムの初期化や利用手順が複雑で、複数の呼び出し側に重複している
  • 下位ライブラリの変更から、上位の利用コードを保護したい
  • 外部へ公開するAPIを、内部構造より小さく安定させたい

一つの関数をそのまま呼べる場合や、単に名前を変えるだけの場合はFacadeを作りません。関連の薄い操作を一つの巨大なServiceへ集めることもFacadeではありません。

実装方針

  • 利用者の目的をメソッド名と入出力で表し、下位APIをそのまま写さない
  • transaction、部分失敗、再試行、補償処理の境界を明示する
  • 認証・認可、ログ、キャッシュを「横断的だから」という理由だけで無条件に集約しない
  • 利用側が必要な詳細まで隠して、回復や性能判断を不可能にしない
  • Facadeが成長し続ける場合は、異なる利用目的が混ざっていないか分割する

Application Serviceが一つのユースケースを調整する場合、結果としてFacadeに似た入口になることがあります。ただし、パターン名よりtransactionと業務上の責務を優先します。

参考資料