コンテンツにスキップ

リスコフの置換原則

出典: フリー百科事典『ウィキペディア(Wikipedia)』
バーバラ・リスコフの写真
リスコフの置換原則の概念は、バーバラ・リスコフにより初めて導入された。2010年に撮影された写真。

リスコフの置換原則(りすこふのちかんげんそく、: Liskov substitution principle)は、オブジェクト指向プログラミングにおいて、サブタイプのオブジェクトはスーパータイプのオブジェクトの仕様に従わなければならない、という原則である。リスコフの置換原則を満たすサブタイプを behavioral subtype英語版 と呼ぶ。

リスコフの置換原則の概念は最初、1987年10月のOOPSLAでのバーバラ・リスコフの基調講演 “Data abstraction and hierarchy”[1]にて、インフォーマルな形で紹介された。より形式的な定義は1994年のリスコフとウィング英語版の共著論文 “A Behavioral Notion of Subtyping[2] で与えられた。

定義

[編集]

リスコフの置換原則は Liskov 1988 において以下のように説明されている:

The intuitive idea of a subtype is one whose objects provide all the behavior of objects of another type (the supertype) plus something extra. What is wanted here is something like the following substitution property: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2, then S is a subtype of T.
(直感的な考えでは、「サブタイプ」のオブジェクトは別の型(「スーパータイプ」)のオブジェクトのすべての振る舞いと、更に別の何かを備えたものである。 ここで必要とされるものは、以下に示す置換の性質のようなものだろう:型 S の各オブジェクト o1 に対し、型 T のオブジェクト o2 が存在し、T に関して定義されたすべてのプログラム Po1o2 で置き換えても動作を変えない場合、ST のサブタイプである。)
B. Liskov、Data Abstraction and Hierarchy、Liskov 1988, p. 25, 3.3. Type Hierarchy

より形式的な定義は Liskov & Wing 1994 で与えられており、以下のように要約されている:

Let φ(x) be a property provable about objects x of type T. Then φ(y) should be true for objects y of type S where S is a subtype of T.
φ(x) を型 T のオブジェクト x に関して証明可能な性質とする。このとき、φ(y) は型 T のサブタイプ S のオブジェクト y について真でなければならない。)
B. Liskov and J. Wing、A Behavioral Notion of Subtyping、Liskov & Wing 1994, p. 1812, 1. INTRODUCTION, Subtype Requirement

ここで性質 φ はオブジェクトの振る舞いを表す述語である。「振る舞い」はオブジェクトの操作(メソッド)が満たすべき事前条件と事後条件によって特徴付けられる。

振る舞いサブタイピング

[編集]

リスコフの置換原則では、ホーア論理に準拠して、振る舞いの事前条件と事後条件に焦点を当てたオブジェクトの代入可能性が要点にされている。その目的は、基底型の変数に派生型を代入しても支障をきたさないこと、基底型オブジェクトを派生型オブジェクトで型安全に代替できることである。

リスコフの置換原則は、基底型からの派生型の定義に際して、以下の項目の順守を提唱している。

  1. 事前条件(preconditions)を、派生型で強めることはできない。派生型では同じか弱められる。
  2. 事後条件(postconditions)を、派生型で弱めることはできない。派生型では同じか強められる。
  3. 不変条件(invaritants)は、派生型でも保護されねばならない。派生型でそのまま維持される。
  4. 基底型の例外(exception)から派生した例外を除いては、派生型で独自の例外を投げてはならない。

条件を強めるとはプロセス上の状態の取り得る範囲を狭くすることであり、条件を弱めるとはプロセス上の状態の取り得る範囲を広くすることである。これは実装視点では様々なアサーションの複合になる。例えば型の汎化/特化、数値の範囲、データ構造の内容範囲、コードディスパッチ先の選択範囲といった様々な事柄を含む。

注意点として、リスコフの置換原則や振る舞いサブタイピングは、通常の言語の型システムによってチェックできることではない。プログラムが型チェックに通ったからと言って「リスコフの置換原則を満たす」と言えるわけではない。[独自研究?]

脚注

[編集]

出典

[編集]

参考文献

[編集]

関連項目

[編集]