依存性逆転の原則(Dependency Inversion Principle、DIP)は、高水準のモジュールは低水準のモジュールに依存すべきではなく、どちらも抽象に依存すべきだと述べています。また、抽象は詳細に依存すべきでなく、詳細が抽象に依存すべきであるとも言います。
DIPの基本的な概念は以下のようにまとめられます:
- 高水準のモジュール(例: 抽象クラスやインターフェース)は、低水準のモジュールに依存してはならない。どちらも抽象に依存すべきである。
- 抽象は詳細に依存してはならない。詳細が抽象に依存すべきである。
これにより、柔軟性が向上し、システム全体が変更に対してより堅牢で拡張可能になります。
DIPを守らない設計例
この例では、Switch クラスが LightBulb クラスに直接依存しており、依存性逆転の原則に反しています。高水準のモジュールである Switch が低水準のモジュールである LightBulb に直接依存しているため、柔軟性が低下し、新しい種類の LightBulb を使う場合に変更が必要となります。
DIPを守った場合の設計例
この修正例では、Switch クラスが LightBulb ではなく Switchable という抽象に依存するように変更されています。これにより、新しい種類の Switchable を追加する際に、既存のコードを変更せずに拡張できるようになり、依存性逆転の原則が守られるようになります。