依存性逆転の原則
依存性逆転の原則は、アメリカのソフトウェア技術者ロバート・C・マーティン(英語版)によって確立され、彼の論文「オブジェクト指向設計品質指標 - Object Oriented Design Quality Metrics」内の「依存性の分析 - an analysis of dependencies」節を含んだ2000年以降の数々の出版物に記載されていた。「Agile Software Development, Principles, Patterns, and Practices」「Agile Principles, Patterns, and Practices in C#」などのアジャイル系がよく知られる。
依存性逆転の原則と銘打たれたのは、1996年5月のC++研究論文の記事内とされている。
依存性逆転の原則または依存関係逆転の原則(dependency inversion principle)とは、オブジェクト指向設計の用語であり、ソフトウェアモジュールの疎結合を確立する特別な形態を表現したコンセプトである。SOLIDの五原則の一つとして知られる。
オブジェクト指向における従来の依存関係とは、上位モジュールから下位モジュールへの方向性であり、仕様定義を担う上位モジュールを、詳細実装を担う下位モジュールから独立させて、各下位モジュールを別個保存するというものだったが、それに対して依存性逆転原則は以下二点を提唱している。
上位モジュールはいかなるものも下位モジュールから持ち込んではならない。双方とも抽象(例としてインターフェース)に依存するべきである。"High-level modules should not import anything from low-level modules. Both should depend on abstractions (e.g., interfaces)."
抽象は詳細に依存してはならない。
DIPの2つの一般的な実装では、さまざまな意味でよく似た論理アーキテクチャを使用する。
直接的な実装において、 policy クラスと service 抽象クラスは一つのライブラリーにパッケージ化される。この実装では上位コンポーネントと下位コンポーネントは別々のパッケージ/ライブラリとして配布される。上位レベルコンポーネントによって要求される振る舞い/サービスを定義したインターフェースは上位レベルコンポーネントによって所有され、上位レベルコンポーネントと同じライブラリの中に存在する。
上位レベルコンポーネントのインターフェースは下位レベルコンポーネントによって実装されるため、コンパイル時に下位レベルコンポーネントが上位レベルコンポーネントに依存する事が必要になる。よって従来の依存関係は逆転する。
Figures 1 and 2 では同じ機能を実現したコードを表現している。しかし、 Figure 2 ではインターフェースは依存性を逆転させるために使用されている。policy コードの再利用性を最大化したり、循環依存を排除するために依存の方向は選択することができる。
このバージョンの DIP では、下位レイヤーコンポーネントが上位レベルレイヤーのインターフェース/抽象に依存しているため、下位レベルレイヤーの再利用は困難になる。 この実装はその代わりに伝統的な to-to-bottom の依存関係を反対の bottom-to-top へと逆転させる。
抽象コンポーネントをライブラリやパッケージから独立させて置くと、より柔軟性が増す。
全てのレイヤーを分離して個別のパッケージに置くことでどのレイヤーの再利用性も向上し、ロバストネス性とモビリティーを得ることができる。