3秒でわかる
どのモジュールがどのモジュールを知っているかという参照の向き。この向きを一方向に揃えることが、変更に強い構造を作る鍵になります。
もう少し詳しく
どういうものか
依存方向は、あるモジュールが別のモジュールを参照している向きのことです。A が B の関数を呼んだり、B の型を引数に使ったりしていれば、A は B に依存しています。図では A から B へ矢印を引きます。
重要なのは、この関係が一方向であることです。A が B を知っていて、B は A を知らない。この状態なら、A を消しても B はそのまま動きます。
なぜ必要か
依存の向きは、変更の伝わる向きと同じです。B を書き換えると A に影響が出ますが、その逆は起きません。つまり、頻繁に変わるものが安定したものに依存する形にしておくと、変更の波及が小さく収まります。反対に、業務ルールが画面の都合を知っていると、画面を直すたびにルールを触ることになります。
具体例
層を分けた構成では、外側から内側へ向けて依存を揃えます。
Controller ──▶ UseCase ──▶ Domain
│ │
└──────────────┴──▶ Repository (インタフェース)
▲
│ 実装だけが内側を向く
MySqlRepositoryDB を扱う具体的な実装は外側に置き、内側は「保存できる」というインタフェースだけを知っています。内側が外側を直接知らないので、DB を差し替えても業務ルールのコードは変わりません。
// 内側 何で保存するかは知らない
public <a href="/glossary/interface" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">interface</a> OrderRepository {
void save(Order order);
}
// 外側 内側のインタフェースを実装する側が依存を負う
public class MySqlOrderRepository implements OrderRepository {
public void save(Order order) { /* <a href="/glossary/sql" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">SQL</a> を書く */ }
}