TL;DR

上位のモジュールが下位のモジュールに直接依存せず、どちらも抽象(インタフェースなど)に依存するようにする設計原則。Robert C. Martin が提唱し、SOLID 原則の D にあたる。

なぜ必要か

従来の層構造では、上位の方針を表すコードが下位のコードを直接呼ぶので、上位のコードが実装の詳細に依存する。Wikipedia によると、依存を逆にすれば、上位のコードを別の実装と組み合わせて再利用できる。

手を動かしてわかるクリーンアーキテクチャ の第 3 章によると、クリーンアーキテクチャは「すべての依存は中心に向かうようにする」というルールを守るために、この原則でドメイン層への依存を作る。

仕組み

Wikipedia では、原則を次の 2 つの文で表している。

  • 上位のモジュールは下位のモジュールから何も import してはならない。どちらも抽象に依存すべきである。
  • 抽象は詳細に依存してはならない。詳細(具体的な実装)が抽象に依存すべきである。

上位の層が必要とする振る舞いをインタフェースとして定め、そのインタフェースを上位の層が持つ。下位の層はそのインタフェースを実装する。こうすると、依存の矢印が従来とは逆を向く。

例

手を動かしてわかるクリーンアーキテクチャ の第 4 章では、AccountRepository インタフェースをドメイン層に置き、その実装を永続化層に置いて、永続化層からドメイン層への依存にしている。ヘキサゴナルアーキテクチャの送信ポートも、コアが定義して所有し、アダプタが実装する。

注意点

Wikipedia によると、インタフェースを足すだけでは結合は弱まらない。やり取りそのものを抽象として設計する必要がある。

関連

出典