お久しぶりです、らべねこです。
私は今「アジャイルソフトウェア開発の奥義」という本を読んでいます。
その中のSOLID原則の部分がよく分からなかったので、私なりにまとめて理解したものをQiitaに投稿しています。
今回は第5回です。
第1回はこちら https://qiita.com/labeneko/items/3033c9a0fa0772a864c2
第2回はこちら https://qiita.com/labeneko/items/92fd93ed1e4a07565869
第3回はこちら https://qiita.com/labeneko/items/6b41d717cd2a6b1d472b
第4回はこちら https://qiita.com/labeneko/items/d7073d50e809cbc51d78
間違い等ありましたらご気軽にコメントください。
SOLID原則とは
多くの設計で用いられている考え方を原則としてまとめたものです
以下の5つの原則があります
S:SRP、単一責任の原則
O:OCP、オープン・クローズドの原則
L:LSP、リスコフの置換原則
I:ISP、インタフェース分離の原則
D:DIP、依存性逆転の原則
第5回は、依存性逆転の原則についてまとめました
D:依存性逆転の原則(DIP: The Dependency Inversion Principle)
守るべきルール
- 上位のモジュールは、下位のモジュールに依存してはならない。どちらのモジュールも「抽象」に依存すべきである。
- 「抽象」は実装の詳細に依存してはならない。実装の詳細が「抽象」に依存すべきである。
上位のモジュールが下位のモジュールに依存しているとは?
例えばデータベースからデータを取ってくるとき、データベースを扱うモジュールを作って、使う側はそのモジュールを呼んでデータを取得するという実装があったとします。
この場合、データベースを扱うモジュールが下位のモジュールで、使う側が上位のモジュールです
例えばデータベースを扱うモジュールに実装の変更があり、その結果、返す結果の形式に変更があるといった場合があったとします。
このとき、呼ぶ側でも実装の変更をしないといけない場合は、それは「依存している」ということになります
上位のモジュールが下位のモジュールに依存しないために、「抽象」に依存するとは
データベースから返ってくるデータの形式を、抽象に依存するようにし、呼ぶ側もその抽象に依存するようにすれば、データベースを扱うモジュールに実装の変更があっても、返す結果の形式に変更がないため、呼ぶ側に実装の変更はありません。
「抽象」は実装の詳細に依存してはならない。実装の詳細が「抽象」に依存すべきであるとは
しかし、抽象が実装の詳細に依存し、抽象を変更しないといけない場合は、結果的に呼ぶ側の実装も変更しなければならないので問題になるということです。
できるだけ実装の詳細に依存しない抽象であることが大事です。
結論
上位のモジュールが下位のモジュールに依存するのではなく、下位のモジュールが上位のモジュールに依存するということかな?と思ったのですが、そうではありません
上位のモジュールが下位のモジュールに依存すると、下位のモジュール変更で上位のモジュールに変更が発生するので、結果的にOCP、オープン・クローズドの原則に違反してしまいます。
しかし、この原則にはデメリットもあります。抽象化は複雑性が増すので、保守が難しくなってしまいます。これはSOLID原則全てに言えることです。
SOLID原則の説明は以上です。
お付き合いいただきありがとうございました。