Clean Architecture Part III ch11 DIP: The Dependency Inversion Principle
Dependency Inversion Principle
- 具象に依存するな
- 具象のモジュールって何
- 実際にコールされる関数が実装されているモジュール
- もちろん避けられない依存もある
- String型とか
- 抽象化するのは困難だし、するべきでもない
- 具象でも、安定していて変化しないことがわかっていれば依存してよい
- OS
- プラットフォーム
- 変更されやすい具象に依存するな
- 活発に開発され、頻繁に変更されている
Stable Abstrations
- 実装が変更されても、インタフェースは必ずしも変更されない
- 【補】インタフェースが変更をうけるとすべてが影響を受ける
- 良い設計とは、インタフェースを変更することなく機能を追加できるもの
- 下記の慣行に還元される
- 変更されやすい具象クラスを参照するな
- 代わりに抽象インタフェースを参照せよ
- オブジェクトの生成ならAbstract Factory (Gang of Four)とか
- 変更されやすい具象クラスから派生するな
- 静的型付け言語において、継承は最も密結合
- 【補】変更されやすいものに密結合するな、ということ
- 具象関数をオーバライドするな
- オーバライドされる具象関数じたいが依存を持っている
- オーバライドするということは、上記の依存を引き継いでしまうということ
- 代わりに抽象関数をオーバライドせよ
- 具体的で変更されやすい名前はNG
- 変更されやすい具象クラスを参照するな
Factories
- 具象クラスを直接newすると依存してしまう
- Abstract Factory使え
- システムは2つのコンポーネントに分かれる
- Abstract
- 高水準のビジネスルール
- Concrete
- ビジネスルールが操作する低水準の実装詳細
- Abstract
- 制御フローは依存の向きと逆になることに注目
- だから「Dependency Inversion」
Concrete Components
Conclusion
英語
- capricious
- 気まぐれな