LSP: The Liskov Substitution Principle
-
置換可能性
- o1: S
- o2: T
- P —> T
- SがTのサブタイプならば、o2の代わりにo1を使ってもPの振る舞いは変わらない
-
基底型と派生型の間に成り立っていなければならない性質
- 【補】プログラミング言語機構の「継承」は必ずしもこれを保証しない(後述)
Guiding The Use of Inheritance
- LSPを満足している例
Billing
クラスはいずれの派生型にも依存していないPersonalLicense
,BusinessLicense
はいずれもLicense
と置換可能
The Square/Rectangle Problem
- LSPを満足していない例
-
- Rectangle: 幅高さ別々に設定できる
- Square: 幅高さ別々に設定できない
-
置換不可能なので、利用側は型情報で分岐するほかない
- 【補】汎化できないということ
- 【所感】汎化はできないことがわかったところで、Rectangleの実装をSquareに再利用したいときはこうするのがよいのかな
LSP and Architecture
- OO黎明期、LSPは「継承の使い方のガイド」だった
- やがて、「インタフェースの実装」についての、より広範な原則に変容した
-
クラスよりも高水準なソフトウェア構造に対しても適用可能
-
例
- RESTインタフェース
- アーキテクチャ
-
共通点
- 利用者がある
- 利用者はwell-definedなインタフェースに依存している
- 利用者は、インタフェースの実装が置換可能であることに依存している
-
Example LSP Violation
- 置換不可能だとどうなる
-
Special Caseが必要になる
- error-prone
- 肥大化する
Conclusion
- LSPはアーキテクチャレベルにも拡張可能であるし、すべき
- LSPに違反するとSpecial Caseやそれを扱うための余計なメカニズムが必要になる
英語
-
pertain
- …に関する、つきものである