TL;DR
上位のモジュールが下位のモジュールに直接依存せず、どちらも抽象(インタフェースなど)に依存するようにする設計原則。Robert C. Martin が提唱し、SOLID 原則の D にあたる。
なぜ必要か
従来の層構造では、上位の方針を表すコードが下位のコードを直接呼ぶので、上位のコードが実装の詳細に依存する。Wikipedia によると、依存を逆にすれば、上位のコードを別の実装と組み合わせて再利用できる。
手を動かしてわかるクリーンアーキテクチャ の第 3 章によると、クリーンアーキテクチャは「すべての依存は中心に向かうようにする」というルールを守るために、この原則でドメイン層への依存を作る。
仕組み
Wikipedia では、原則を次の 2 つの文で表している。
- 上位のモジュールは下位のモジュールから何も import してはならない。どちらも抽象に依存すべきである。
- 抽象は詳細に依存してはならない。詳細(具体的な実装)が抽象に依存すべきである。
上位の層が必要とする振る舞いをインタフェースとして定め、そのインタフェースを上位の層が持つ。下位の層はそのインタフェースを実装する。こうすると、依存の矢印が従来とは逆を向く。
例
手を動かしてわかるクリーンアーキテクチャ の第 4 章では、AccountRepository インタフェースをドメイン層に置き、その実装を永続化層に置いて、永続化層からドメイン層への依存にしている。ヘキサゴナルアーキテクチャの送信ポートも、コアが定義して所有し、アダプタが実装する。
注意点
Wikipedia によると、インタフェースを足すだけでは結合は弱まらない。やり取りそのものを抽象として設計する必要がある。