ポートとアダプターパターン
Ports and Adapters
書くとなるビジネスロジックを分離するパターン。
ヘキサゴナルアーキテクチャと呼ばれるものと同じ。
システムが複数の入力デバイスをサポートする必要がある、または入力デバイスが変わる可能性がある場合に効果がある。
モジュール構造、コンポーネント&コネクター構造のどちらでもこの考えを取り入れられる。
要素
レイヤー。使用するデータやイベントの発生場所に関する知識を持たないドメイン、またはビジネスロジック。
ポート。レイヤーとアダプター間のインターフェースを記述したもの。レイヤーを具体的なアダプターから切り離す。
アダプター。外部のデータソース、デバイスなど。レイヤーがその他のコンポーネントとやり取りするためのもの。
関係
〜をさらす。🤔
レイヤーAがポートBをさらす? ポートAをレイヤーBにさらす?
〜を実装する。アダプターAはポートBの制約を実装する。
〜を差し込む。レイヤーAのためのポートBに、アダプターCを組み合わせる。
規約
レイヤーはポートを持つことで利用可能になる
ポートがないレイヤーもある(内部レイヤー)
アダプターは1つ以上のポートの制約を満たさねばならず、ポート用のインタフェースを実装している場合のみ、ポートに差し込むことができる。
強み
テスト容易性、保守容易性、修正容易性を促進する。
様々なチームが様々なレイヤー/アダプターで並行的な作業ができる。
弱み
実行時に使用されるアダプターを選択するメカニズムが必要。
静的なモジュール構造ならDependency Injection、動的なC&C構造ならService Meshだろうか?
セキュリティや信頼性など、実行時の品質特性はアダプターに依存する。
サードパーティ性のアダプターの選択は変更可能ではないので慎重に選択する必要がある。