依存性逆転の原則(Dependency Inversion Principle, DIP)のたとえ話

コンセントと家電

昔の家では、家電ごとに専用のコンセントが必要でした。

  • ドライヤー専用コンセント
  • 炊飯器専用コンセント
  • テレビ専用コンセント

つまり、家電とコンセントが直接結びついていたため、新しい家電を導入するときは、壁の工事をして新しいコンセントを取り付けなければなりませんでした。


今は、コンセントの形が統一されています。

  • AタイプやBタイプなど、共通規格のコンセントに従うことで、
  • どんな家電も、差し込むだけで使えるようになっています。

つまり、新しい家電が登場しても、コンセントを交換する必要はありません。


プログラムへの置き換え

  • 昔のコンセント:具体クラスに直接依存する状態→ 家電(具体クラス)が変わるたびに、コードを修正しなければならない。
  • 今のコンセント:インターフェースに依存する状態→ 家電がどんな機種に変わっても、共通のルール(インターフェース)を守っていれば、コードはそのまま使える。

依存性逆転の原則とは

  • 高水準モジュール(使う側)は、低水準モジュール(使われる側)の具体的な実装に依存してはいけない。
  • 両方が共通の抽象(インターフェースや抽象クラス)に依存するべきである。

まとめ

  • 依存性逆転の原則は、「細かい実装に依存するのではなく、共通のルールに依存しよう」という考え方。
  • コンセントの形を統一することで、新しい家電が来ても安心して使えるようにするのと同じ。

通常の依存関係

一般的なプログラムでは、次のような関係になります。

  • 高水準モジュール(ビジネスロジック、ゲーム管理、コア機能など)
  • 低水準モジュール(データベース、ファイル入出力、サウンド再生などの具体的な仕組み)

通常は、高水準モジュールが低水準モジュールに依存します。

高水準モジュール(使う側)
    ↓ 依存
低水準モジュール(使われる側)

例:

  • プレイヤー管理クラスが、直接サウンド再生クラスに依存している。

依存性逆転の考え方

依存性逆転の原則では、依存の向きを変えます。

  • 高水準モジュールも低水準モジュールも、共通のインターフェースに依存します。
  • インターフェース(抽象)を中心に依存関係を組み立てます。
高水準モジュール(使う側)
    ↑ 依存
共通インターフェース
    ↓ 依存
低水準モジュール(使われる側)
  • 高水準モジュールが、どんな実装が来るかを制御する立場になります。
  • 実装の詳細が変わっても、高水準モジュールは影響を受けません。

逆転と呼ばれる理由

もともと「上(高水準モジュール)が下(低水準モジュール)に依存していた」依存関係が、

「下(低水準モジュール)が上(高水準モジュール)の決めたルールに従う」という形に逆転するからです。

通常の依存の方向:

  • 高水準 → 低水準

逆転後の依存の方向:

  • 高水準 ← インターフェース → 低水準

これが「依存性逆転」と呼ばれる理由です。


まとめ

通常の設計依存性逆転
依存の向き高水準 → 低水準高水準 ← インターフェース → 低水準
柔軟性低い高い
変更耐性弱い(下の変更に影響される)強い(上の安定性が保たれる)
利点実装が早いが脆弱実装は少し手間でも保守性が高い

訪問数 18 回, 今日の訪問数 1回