読者です 読者をやめる 読者になる 読者になる

The Liskov Substitution Principle (LSP) リスコフの置換原則


リスコフの置換原則とは

基本クラスへのポインタや参照を使用する関数やオブジェクトは、派生クラスの種類や振る舞いが何であろうと、派生クラスについて全く何も知らなくてもそれを使えるようになっていなければならない

Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

Subclasses should be substitutable for their base classes.[by Martin]

内容

オブジェクト指向プログラミングにおける派生型の定義の一種であり、1993年、バーバラ・リスコフと Jeannette Wing が論文 Family Values: A Behavioral Notion of Subtyping で提唱した。

リスコフの置換原則はクラス同士の継承関係が正しいか(継承すべきか、正しいis-a関係か)を検証する原則で、基底クラスを派生クラスに置き換えて動作しなかった場合、その継承関係は破棄するべきとなる。

つまり、親クラスのルールを子クラスが破ってはならない。そのような状況となるのは継承関係、または抽象化が間違っているということになる。

四角形のクラスを継承して正方形のクラスを作成した場合、子である正方形は縦横の辺の長さが同じでなければならないという制約が加わる。四角形クラスを正方形クラスに置き換えた場合、新たに加わった制約により、既存のコードが動かなくなるため、このような継承はよろしくないこととなる。

上記ルールを契約として定義することで、リスコフの置換原則を厳密に定義できるようになる。
Bertrand Meyer氏によって提起されたDesign by Contract(DbC:契約による設計)はソフトウェア設計におけるその正当性を計る方法論

簡素な解説

クライアントが使用している基本クラス型を派生クラス型に置き換えても正常に動作しなくてはならない。そのためには派生クラスは基本クラスの振る舞いの妥当性を維持する必要がある。基本クラス以下の機能しか持たない派生クラスは、基本クラスと置き換えることはできない。

バートランド・メイヤーによって提唱された「契約による設計(DBC:Design By Contract)」を使用すれば、この原則を適用できるようになる。「契約による設計」では、クラスの振る舞いを、クラスが持つ各メソッドの事前条件と事後条件、クラスの不変条件によって明文化する。

参考文献

詳しいレポート:http://www.objectmentor.com/resources/articles/lsp.pdf