The Dependency Inversion Principle (DIP) 依存関係逆転原則

依存関係逆転原則とは

A.上位モジュールは下位モジュールに依存してはならない。両者は抽象に依存すべきである
B.抽象は詳細(抽象の実装クラス)に依存してはならない。詳細は抽象に依存すべきである

A. High level modules should not depend upon low level modules. Both should depend upon abstractions.
B. Abstractions should not depend upon details. Details should depend upon abstractions.

Depend upon Abstractions. Do not depend upon concretions.[by Martin]

内容

上位のモジュールが下位のモジュールに依存しすぎた場合、下位モジュールの変更が、連鎖的に上位モジュールに影響を与えてしまう。以下のように抽象レイヤーを設けることで、レイヤー間での依存を解消する。

High Level Classes -> Abstraction Layer -> Low Level Classes

Abstraction Layerは下位モジュールのインタフェースであり、下位モジュールはそれを実装。上位モジュールはAbstraction Layerにて下位モジュールとやり取りを行う。


上位レベルのモジュールをクライアントとして考えた場合に、従来の方法では、下位レベルのモジュールのインターフェイスにクライアントが依存していた。つまり、本来クライアントが受けるべきサービスのインターフェイスの所有者は、下位レベルのモジュールであると考えられる。しかし、この原則に従えばクライアント側でサービスのインターフェイスを宣言することになり、「インターフェイスはクライアントに属する」ことになる。オブジェクト指向設計では、このようにインターフェイスの所有権を逆転させることがとても重要になってくる。

参考文献

詳しいレポート:http://www.objectmentor.com/resources/articles/dip.pdf

その他の原則

blog1.mammb.com