依存関係逆転の原則
バッドプラクティスから学ぶ 依存関係逆転の原則 による柔軟なシステム設計
依存関係逆転の原則 とは?
依存関係逆転の原則(Dependency Inversion Principle, DIP)とは、SOLID原則の一つであり、以下の2点を示しています。
- 上位レベルのモジュールは低位レベルのモジュールに依存してはならず、どちらも抽象に依存すべきである。
- 抽象は詳細に依存してはならず、詳細が抽象に依存すべきである。
簡単に言えば、具体的な実装に依存するのではなく、抽象的なインターフェースに依存することです。
なぜ 依存関係逆転の原則 が重要なのか?
依存関係逆転の原則を守ることで、ソフトウェア設計の柔軟性や拡張性が劇的に改善されます。具体的なクラスに強く依存していると、変更に弱く、保守が難しくなります。しかし抽象に依存することで、新たな機能や変更を加える際の影響範囲を最小限に抑えることができます。
解説
例えば、通知機能を持ったコードを考えてみましょう。メール通知だけを想定し直接メール送信クラスに依存している場合を示します。
修正前のコード
問題点
Order
クラスが具体的な通知手段であるEmailNotifier
に直接依存しています。- 通知手段を変更・追加するとき、
Order
クラスの修正が必要になります。
修正後のコード
解決された問題
- 注文クラスは具体的な通知方法を知らなくてもよくなり、通知手段を後から追加・変更しても修正の必要がなくなりました。
- 柔軟性が向上し、保守性が高まりました。
まとめ
依存関係逆転の原則を守ることで、直接的な依存を避け、変更に強いシステムを構築できます。抽象に依存することで、システムはより拡張性が高く、保守性が向上します。
練習問題 (1)
修正前のコード
修正後のコード
解説
直接具体的なMysqlデータベースに依存するのをやめて抽象Databaseクラスに依存させました。これにより、後からPostgreSQLやMongoDBなど他のDBを簡単に使えるようになります。
練習問題 (2)
修正前のコード
修正後のコード
解説
Exporterという抽象を導入することで、後でJSONやExcelなどの別形式出力への変更が容易になりました。
練習問題 (3)
修正前のコード
修正後のコード
解説
支払い方法を抽象化することで、将来的にPaypalなど別手段への変更が簡単になります。
練習問題 (4)
修正前のコード
修正後のコード
解説
UserSession
クラスがLocalStorage
に直接依存しないように修正しました。これにより、クラウドストレージやデータベースなど別の保存手段を簡単に導入できるようになります。
練習問題 (5)
修正前のコード
修正後のコード
解説
Document
クラスがPdfGenerator
に直接依存しないようにし、DocumentGenerator
という抽象クラスを導入しました。将来的にWordやHTML形式での出力も可能になります。
以上のように、依存関係逆転の原則により具体的な実装への依存を避け、柔軟でエレガントな設計が可能になります。