勉強日記

チラ裏

Clean Architecture Part III ch11 DIP: The Dependency Inversion Principle

www.pearson.com


Dependency Inversion Principle

  • 具象に依存するな
  • 具象のモジュールって何
    • 実際にコールされる関数が実装されているモジュール
  • もちろん避けられない依存もある
    • String型とか
    • 抽象化するのは困難だし、するべきでもない
  • 具象でも、安定していて変化しないことがわかっていれば依存してよい
    • OS
    • プラットフォーム
  • 変更されやすい具象に依存するな
    • 活発に開発され、頻繁に変更されている

Stable Abstrations

  • 実装が変更されても、インタフェースは必ずしも変更されない
  • 【補】インタフェースが変更をうけるとすべてが影響を受ける
  • 良い設計とは、インタフェースを変更することなく機能を追加できるもの
  • 下記の慣行に還元される
    • 変更されやすい具象クラスを参照するな
      • 代わりに抽象インタフェースを参照せよ
      • オブジェクトの生成ならAbstract Factory (Gang of Four)とか
    • 変更されやすい具象クラスから派生するな
      • 静的型付け言語において、継承は最も密結合
      • 【補】変更されやすいものに密結合するな、ということ
    • 具象関数をオーバライドするな
      • オーバライドされる具象関数じたいが依存を持っている
      • オーバライドするということは、上記の依存を引き継いでしまうということ
      • 代わりに抽象関数をオーバライドせよ
    • 具体的で変更されやすい名前はNG

Factories

  • 具象クラスを直接newすると依存してしまう
  • Abstract Factory使え

クラス図

  • システムは2つのコンポーネントに分かれる
    • Abstract
      • 高水準のビジネスルール
    • Concrete
      • ビジネスルールが操作する低水準の実装詳細
  • 制御フローは依存の向きと逆になることに注目

Concrete Components

  • 具象ServiceImpl --> 具象ConcreteImplがあるので、ここはDIP違反
  • DIP違反は完全には取り去れない
    • 少数の具象コンポーネントにまとめて隔離することが寛容
      • 【補】関数型パラダイムで、完全に取り去れない副作用を隔離するのと似てますね
    • エントリポイントは具象
      • main関数とか

Conclusion


英語

  • capricious
    • 気まぐれな