ポート&アダプター

ポート&アダプターとは、ビジネスロジックを外部の技術的詳細から切り離すためのアーキテクチャパターン。

Alistair Cockburn が2005年に提唱。六角形(ヘキサゴナル)アーキテクチャとも呼ばれる。

背景

レイヤードアーキテクチャでは、上位層が下位層に依存する一方向の階層構造をとる。この構造では、ビジネスロジック層がデータアクセス層の具体的な実装に依存してしまい、データベースの変更がビジネスロジックに波及する問題があった。

ポート&アダプターは、この依存関係を逆転させることで、ビジネスロジックがどの外部技術にも依存しない構造を実現する。

構成要素

ビジネスロジック(コア)

アプリケーションの中心に位置する、純粋なドメインロジック。外部の技術的な詳細を一切知らない。

ポート

ビジネスロジックが外部とやり取りするためのインターフェース(境界)。

  • 入力ポート(ドライビングポート) — 外部からビジネスロジックを呼び出すためのインターフェース。ビジネスロジックが実装を提供する
  • 出力ポート(ドリブンポート) — ビジネスロジックが外部リソースを利用するためのインターフェース。ビジネスロジックが定義し、アダプターが実装する

アダプター

ポートの具体的な実装。外部技術とポートの間を変換する。

  • 入力アダプター(ドライビングアダプター) — Web アプリ、モバイルアプリ、テストスクリプトなど。入力ポートを通じてビジネスロジックを駆動する
  • 出力アダプター(ドリブンアダプター) — データベース、ファイルシステム、決済サービスなど。出力ポートを実装し、外部リソースへのアクセスを担う

ポート&アダプターの構造

依存の方向

すべての依存は外側(アダプター)から内側(ビジネスロジック)に向かう。ビジネスロジックはポートというインターフェースだけを知っており、その先に何が接続されているかを知らない。

この構造により、アダプターの差し替えだけで以下のようなことが可能になる。

  • データベースを MySQL から PostgreSQL に変更する
  • Web UI をモバイルアプリに置き換える
  • 本番の決済サービスをテスト用のモックに差し替える

レイヤードアーキテクチャとの比較

観点レイヤードポート&アダプター
依存の方向上位層 → 下位層(一方向)外側 → 内側(依存性逆転)
ビジネスロジックの依存先データアクセス層の実装ポート(インターフェース)のみ
外部技術の交換層をまたいで影響が波及しやすいアダプターの差し替えで完結する
テスト容易性DB 等の外部依存を含みやすいアダプターをモックに差し替えて単体テスト可能