お久しぶりです、らべねこです。
私は今「アジャイルソフトウェア開発の奥義」という本を読んでいます。
その中のSOLID原則の部分がよく分からなかったので、私なりにまとめて理解したものをQiitaに投稿しています。
今回は第3回です。
第1回はこちら https://qiita.com/labeneko/items/3033c9a0fa0772a864c2
第2回はこちら https://qiita.com/labeneko/items/92fd93ed1e4a07565869
間違い等ありましたらご気軽にコメントください。
SOLID原則とは
多くの設計で用いられている考え方を原則としてまとめたものです
以下の5つの原則があります
S:SRP、単一責任の原則
O:OCP、オープン・クローズドの原則
L:LSP、リスコフの置換原則
I:ISP、インタフェース分離の原則
D:DIP、依存性逆転の原則
第3回は、インタフェース分離の原則についてまとめました
L:リスコフの置換原則(LSP: The Liskov Substitution Principle)
守るべきルール
派生型はその基本型と置換可能でなければならない
事前条件を派生型で強めることはできない。つまり、上位の型よりも強い事前条件を持つ派生型を作ることはできない。
事後条件を派生型で弱めることはできない。つまり、上位の型よりも弱い事後条件を持つ派生型を作ることはできない。
ルールを守らないとどのような問題が起きるか
- リスコフの置換原則を守らないということは、基本型と派生型で振る舞いが違うものができるということになります
- 結果的にモジュールがもろくなり、最終的にオープン・クローズドの原則に違反することになります
(補足)振る舞いが違うということ
結果が違うということとは別です。
例えば図形描画のモジュールがあって、「図形を書く」という基本型のクラスと、そこから派生した「円を書く」「三角形を書く」という派生クラスがあったとします。
派生クラスで描画される結果としては円・三角形と違いますが、「図形を書く」という振る舞いは一緒です。
振る舞いが違うというのは、例えば「三角形を書く」派生クラスを実行したら謎の例外が返ってきたり、「三角形を書く」クラスでしか動かない関数があったりするということです。
結論
オブジェクト指向設計について、そのすべての核心にあるのはオープン・クローズドの原則です。
オープン・クローズドの原則が有効なとき、アプリケーションはずっと使いやすく、再利用可能で頑強なものになります。
リスコフの置換原則は、オープン・クローズドの原則を有効にする主要な役割を果たすものの一つです。
リスコフの置換原則の、「派生型が基本型と置換できる」ということを守ることで、オープン・クローズドの原則である「モジュールに修正を施すことなく拡張する」ということを実現できているということなのです。
そういう意味で、リスコフの置換原則を守るということがとても重要なのです。
第4回では、インタフェース分離の原則について説明します
(今回はらべねこにしか分からないSOLID原則になっている気がする…難しい…)