リスコフの置換原則
概要
リスコフの置換原則(Liskov Substitution Principle、LSP)は、
オブジェクト指向プログラミングにおける重要な原則であり、サブタイプのオブジェクトは必ずスーパークラスの仕様に準拠しなければならないという考え方に基づいています。これは、プログラムの信頼性や再利用性を向上させるために必要な法則です。
この原則は、1987年のOOPSLAカンファレンスで
バーバラ・リスコフが基調講演で紹介し、その後1994年にリスコフとウィングによる論文でより具体的な形で説明されました。この考え方に従うサブタイプは「振る舞いサブタイプ」と呼ばれ、オブジェクトの動作や特性が期待通りであることを確保します。
定義
リスコフの置換原則は、オブジェクトの振る舞いを記述する述語φに基づいています。オブジェクトが持つ振る舞いは、実行可能なメソッドが満たすべき条件、つまり事前条件や事後条件によって規定されます。
振る舞いサブタイピング
リスコフの置換原則では、オブジェクトを安全に代入できるかどうかは、その振る舞いの事前条件と事後条件に依存しています。基底型に派生型のオブジェクトを代入しても、意図した通りに動作し続けるべきです。具体的には、次のようなルールが定められています。
1.
事前条件:派生型では、基底型の事前条件を強化してはならず、同じか弱めることが求められます。
2.
事後条件:派生型では、基底型の事後条件を弱めることはできず、同じか強化する必要があります。
3.
不変条件:派生型は基底型の不変条件を維持しなければなりません。
4.
独自の例外:基底型の発生する例外以外は、派生型で独自の例外を投げないことが望まれます。
これらのルールは、プログラムの整合性を保つために重要です。条件を強化するというのは処理の範囲を狭めることを意味し、一方条件を弱めるのは処理の範囲を広げることを指します。例えば、型の汎化や特化、数値の範囲、データ構造の制約などが影響を及ぼします。
注意点
リスコフの置換原則が守られることは、単にプログラミング言語の
型システムによって自動的にチェックされるわけではありません。型チェックが通ったからといって、必ずしもリスコフの置換原則が満たされているとは限りません。これは、開発者が対処しなければならない重要なポイントです。
参考文献
- - Liskov, B. (1988). “Data abstraction and hierarchy”. ACM SIGPLAN Notices, 23(5), 17–34.
- - Liskov, B., & Wing, J. (1994). “A behavioral notion of subtyping”. ACM Transactions on Programming Languages and Systems, 16(6), 1811–1841.
関連項目
- - 継承
- - サブタイピング
- - ポリモーフィズム
- - 契約による設計
- - 共変性と反変性
リスコフの置換原則を理解することは、
オブジェクト指向プログラミングをより効果的に活用するための基礎となります。