(HASHIMOTO SOFTWARE CONSULTING)トップ
技術コラム
第8回:『科学的モデリング』継承⑧〜「タイプ(型)置換原理」と「論理状態空間」
第8回の話題〜「タイプ(型)置換原理」と「論理状態空間
今回は継承関係をより科学的に理解するために「タイプ(型)置換原理(the principle of type substitution/type
substitution principle)」自身の解説をします。
前回のコラムまでの解説において、継承関係を正しく理解し、活用するには「タイプ(型)置換原理」の理解と適用
が不可欠であることを強調してきました。そして、サンプルの継承関係のクラス図を用いて「タイプ(型)置換原理」
の適用も解説してきました。
今回は「タイプ(型)置換原理」をより良く理解するために基本的かつ重要事項であるタイプ(型)の「論理状態空間」
の解説を行います。「論理状態空間」による「タイプ(型)置換原理」の理解は、数学的に正確でありながら、同
時に直観的に分かり易いというメリットがあります。
そこで、今回のテーマは:
です。
タイプ(型)置換原理の基本原理
第7回のコラムでは、「タイプ(型)置換原理」とその代表例である「リスコフ置換原理(Liskov substitutionprinciple)」を紹介しました。
「リスコフ置換原理」は最も広く知られている「タイプ(型)置換原理」ですが、極めて厳しい(制約が大きい)「タイプ(型)置換原理」です。
このように書くと:
という疑問が生じます。この疑問を解消するには、まずは「タイプ(型)置換原理」についてもう少し色々なことを
理解する必要があります。
そこで今回は「タイプ(型)置換原理」の基本的な考え方を理解していきます。
なおここから解説は「リスコフ置換原則」に焦点を当てた解説ではなく、専門家が提案している色々な「タイプ(型)
置換原理」の根底となる基本解説であることに留意してください。
まず、多くの専門家が提案している「タイプ(型)置換原理」のどれもが、クラスのタイプ(型)の「属性の不変条
件」「クラス不変条件」「操作の事前条件」「操作の事後条件」に注意を払います。
さらにこの中でも最も基本となるのが、クラスの「属性の不変条件(制約)」と「クラス不変条件」です。
そこで、今回はクラスの「属性の不変条件」と「クラス不変条件」に焦点を当てて「タイプ(型)置換原理」を解説
していきます。
タイプ(型)の『論理状態空間』
【図8-1】には、クラス「自動車」とクラス「スポーツカー」およびクラス「トラック」が継承関係にあります。
スーパークラスであるクラス「自動車」に注意を向けると、特性(プロパティ)として3つの属性が定義されている
ことが分かります【図8-2】。
(*今回のコラムは「属性の不変条件」と「クラス不変条件」に焦点を当てて解説するので、操作はクラス図から省略しています)。
3つの属性の制約はその属性の値の有効範囲を指定していることが分かります。ここで、この3つの属性「速度」
「エンジン回転数」「走行距離」を【図8-3】に示すように次元軸で表現してみます。
【図8-3】が示しているのはクラス「自動車」のタイプ(型)の「論理状態空間(logical state space)」と呼ばれる
論理状態空間を構成する各次元軸になります。逆に言えば、全ての次元軸を組み合わせるとクラス「自動車」のタイ
プ(型)の「論理状態空間」が構成されます。
「論理状態空間」が意味することは、クラス「自動車」から生成されるオブジェクト(インスタンス)は、全てこの
「論理状態空間」の各次元軸の範囲内に収まるという事です。
別の表現をすれば、正当な値を持つクラス「自動車」のオブジェクト(インスタンス)の各属性の値は、この「論理
状態空間」の次元軸の範囲の外部に存在することはありえないということです【表8-1】。
『論理状態空間』の継承と「同型」「特殊化」「拡張」
「タイプ置換原理」は、この「論理状態空間」を用いて表現することが可能です。
下記【表8-2】の様になります。
【表8-2】から分かることは下記の2つ点です。
このことを少し詳しく見ていきます。
クラス「スポーツカー」は、独自の属性を追加していません。またスーパークラスのタイプ(型)の制約を再定義し
ていません。このことからクラス「スポーツカー」のタイプ(型)は、スーパークラス「自動車」のタイプ(型)と「同
型」ですから、全く同じ「論理状態空間」であることは簡単に判断できます。
一方、クラス「トラック」は、独自の属性「積載重量」を追加しています。またスーパークラスのタイプ(型)の属
性「速度」の制約を(速度>=0 && 速度<=150)と再定義しています。
このことからクラス「トラック」のタイプ(型)は、スーパークラス「自動車」のタイプ(型)を「特殊化」かつ「拡
張」していることが分かります。
クラス「トラック」の「論理状態空間」を【図8-6】に示します。
【図8-6】を見るとクラス「トラック」の「論理状態空間」は、スーパークラス「自動車」のタイプ(型)を「特殊
化」した分だけ狭い空間になっていることが分かります。
ここで重要なことは、【表8-2】からの論理的帰結で、サブタイプによる「特殊化」は、制約を『強く(厳しく)す
る』ことは可能ですが、『弱く(緩く)』することは不可能であるということです。
ただし、クラス「トラック」は独自の属性「積載重量」を追加しています。属性「積載重量」はスーパークラスで
あるクラス「自動車」のタイプ(型)には存在しない特性(プロパティ)ですから、クラス「トラック」の「論理状態空
間」は、スーパークラスであるクラス「自動車」の「論理状態空間」より1つ次元が多くなります。
つまり、クラス「トラック」の「論理状態空間」は、クラス「自動車」の「論理状態空間」を「拡張」しています。
ここで重要なことは、「拡張」された次元軸はスーパータイプには存在しない次元軸であるため、スーパータイプ
の制約の影響を受けないということです。
クラス「トラック」の「論理状態空間」の全ての次元軸は【図8-7】のようになります。
ここまで解説してきたことを【表8-3】に整理します。
なお、【表8-1】から【表8-3】の『科学的モデリング規則』は、単一継承(single inheritance)だけでなく、多重
継承(multiple inheritance)にも完全に当てはまる規則であることを付け加えておきます。
条件の比較と「強い(厳しい)」と「弱い(緩い)」
ここで「条件同士の比較」について考え方を述べておきます。
まずは、厳密ではないものの、理解と記憶のための「簡易的な方法」として下記の【表8-4】様に覚えると良いでしょう。
もう少し正確に「条件同士の比較」について考えてみます【補足ノート参照】。
条件同士の「同じ(等しい)」「強い(厳しい)」「弱い(緩い)」を判定するには、比較する条件同士間に【図8-8】の
ような関係があるときに比較が可能となります。このとき、2つの条件間の「同じ(等しい)」「強い(厳しい)」「弱い(緩い)」の順序関係が判定できます。
そのため「条件の範囲」の比較をする場合は、まずは各条件の設定と条件の注意を払う必要があります。
【図8-8】から見て分かる通り、2つの条件の範囲が「どちらかの条件にもう片方の条件が含まれる(ケース1)」あ
るいは「完全に一致する(ケース2)」ときのみ条件の比較が可能なことが分かります。
実はケース1とケース2のような関係は「必要条件(necessary condition)」「十分条件(sufficientcondition)」「必要十分条件(necessary and sufficient condition)」
という用語があります【表8-5】。
つまり、条件の比較は「必要条件」「十分条件」「必要十分条件」の関係が成立させるように、条件を設定する必要があることが分かります。
まとめ&次回
今回のコラムは「タイプ(型)置換原理」を直観的に理解するために基本的かつ重要事項であるタイプ(型)の「論理
状態空間」の解説をおこないました。
多相(ポリモフィズム/多態)を利用する場合の継承関係は、専門的な呼び方として「タイプ(型)継承(typeinheritance)」
があります【第2回コラム参照】。
この呼び方から分かるとおり「タイプ(型)継承(type inheritance)」では、タイプ(型)に着目し「タイプ(型)を継
承」することを意味します。そしてスーパークラスのタイプ(型)とサブクラス(型)にサブタイプ(部分型)関係が成立しなければなりません
。
さらに、「振る舞い(意味的)のサブタイプ(部分型)関係の成立が必要」であることもコラムで再三解説してきました。
「タイプ置換原理」により、「振る舞い(意味的)のサブタイプ(部分型)関係が成立するかどうかを判定しますが、これは
タイプ(型)間の「論理状態空間」の包摂関係を理解することで「タイプ置換原理」の考え方の基本が理解できます。
「振る舞い(意味的)のサブタイプ(部分型)関係の成立」を判定するには、タイプ(型)のプロパティ(特性)を明確に
し、クラスのタイプ(型)の「属性の不変条件」「クラス不変条件」「操作の事前条件」「操作の事後条件」を明確に
しなければなりません。
そして、「属性の不変条件」「クラス不変条件」「操作の事前条件」「操作の事後条件」は、継承関係の正確な設
計と実装だけでなく、インスペクションやテストにとっても極めて重要な意味を持ちます【表8-7】。
次回以降は「操作の事前条件」「操作の事後条件」に焦点を移して「タイプ置換原理」について解説をする予定です。
参考文献
文献[8-1] [BARBARAH. LISKOV 1994] A Behavioral Notionof Subtyping
文献[8-2] [Peter Wegner 1991] Concepts and Paradigmsof Object-Oriented Programming
文献[8-3] [Markku Sakkinen] Inheritance and Other Main Principles of C++ and Other Object-Oriented Languages
文献[8-4] [Luca Cardelli , Peter Wegner1985] On Understanding Types,Data Abstraction, andPolymorphism