契約の継承
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/28 09:17 UTC 版)
クラスをモジュールと見た場合、クラスは開放/閉鎖原則にしたがって設計されるべきである。すなわち、クラスのインタフェースの仕様が安定していて、クライアントから見た振る舞いが変わらないようにしなければならない一方で、将来的な機能の追加や仕様の変更を受け入れられなければならない。後者のモジュールの開放性を実現するための方法の一つとして、クラスの継承がある。 「契約による設計」(DbC)では、クラスのインスタンスの抽象的な振る舞い (behaviour) を不変条件と各メソッドの事前条件および事後条件として定義する。DbC に従ってプログラミングする際、クライアントは、事前条件を満たせば事後条件を満たす状態が得られること期待して、サプライヤクラスのエンティティを記述することになる。一方で、ポリモーフィズム(多相性)のため、クライアントが記述したサプライヤクラスそれ自身が常に実装を提供するとは限らず、プログラム実行時には動的束縛されたサブクラスのインスタンスの実装が利用され得る。 サブクラスのインスタンスの振る舞いは前述の通りサブクラス自身の不変条件および各メソッドの事前条件と事後条件によって定義されるが、一方でサブクラスのインスタンスはクライアントと継承元のスーパークラスの契約に拘束され、スーパークラスのインスタンスとしても振る舞えなければならない(リスコフの置換原則)。したがって、クライアントと継承元のスーパークラスの間の契約を実現するため、サブクラスはスーパークラスの不変条件を常に満たさなければならず(したがってサブクラスの不変条件は自身の不変条件とすべてのスーパークラスの不変条件の論理積となる)、またサブクラスの事前条件はスーパークラスの事前条件より弱く(または等しく)、サブクラスの事後条件はスーパークラスの事後条件より強く(または等しく)なければならない。 ここで、「条件 A が条件 B より強い」とは、A が成り立つなら B も必ず成り立ち、逆は成り立たないことを言う。例えば、実数 x に対して x > 2 が成り立つなら常に x > 0 が成り立つが、逆は成り立たない。この場合、実数 x に対する条件 x > 2 は条件 x > 0 より強い、と言える。他方「条件 A が条件 B より弱い」とは、B が A より強いことを指す。
※この「契約の継承」の解説は、「契約プログラミング」の解説の一部です。
「契約の継承」を含む「契約プログラミング」の記事については、「契約プログラミング」の概要を参照ください。
- 契約の継承のページへのリンク