「オブジェクト指向入門 第2版 方法論・実践」を読み終えた。これでようやく「オブジェクト指向入門 第2版」を全て読み終えることが出来た。読むのは確かに大変だったけど、抽象データ型や契約による設計などといったエンジニアにとって役立つ概念を学ぶことができ、今後のプログラムの設計に大いに役立つだろうと思った。
上巻 原則・コンセプト
上巻は特に「第3章 モジュール性」、「第6章 抽象データ型」、「第11章 契約による設計」の3つの章が面白かった。ただ、上巻はどの章を切り取っても非常に面白いので、少なくとも上巻だけは全て読むことをオススメ。上巻については既に感想ブログを書いているので、リンクを貼っておく。
- 「オブジェクト指向入門 第3章モジュール性」メモ - $shibayu36->blog;
- 「オブジェクト指向入門 第6章 抽象データ型」を読んだ - $shibayu36->blog;
- オブジェクト指向入門 第7章〜第10章を読んだ - $shibayu36->blog;
- 「オブジェクト指向入門 第11章 契約による設計」を読んだ - $shibayu36->blog;
- 「オブジェクト指向入門 第2版 原則・コンセプト」を読み終えた - $shibayu36->blog;
下巻 方法論・実践
下巻は思っていたよりは面白くはなかったので、読むのに疲れた人は読まなくても良いかもとは思う。しかし24章の「継承の上手な使い方」という部分は参考になった。この章では、すべての継承は本書が述べる以下のカテゴリのどれか1つに所属していなければならないと断言している。以下はその部分に対する自分のメモ。番号はページ数。
- 部分型継承 210
- クラスAとBがそれぞれ外部システムのオブジェクトの集合A´とB´に対応するものだとする。またB´はA´の部分集合であるとする。Aの後継者の部分型に対応する集合がいずれもB´と互いに素である場合、AとBの間には部分型継承が適用される。Aは暫定クラスでなければならない
- 植物学や動物学などの自然科学の階層的な分類っぽい継承
- 脊椎動物の子孫は哺乳類みたいな
- 制約継承 210
- 定義:もしBのインスタンスが、可能ならAの不変表明に含まれないB独自の不変表明の制約を満たしているならば、制約継承が適用される。Bによって追加された任意の特性は追加された制約からの論理的要請によるものである。AとBは両方共暫定であるか、もしくは両方共有効でなければならない。
- 例) RECTANGLE <- SQUAREなら、追加される制約は2辺の長さが等しいことが追加された制約
- 拡張継承 211
- 定義:Bが追加する特性がAにはない特性で、Aの直接のインスタンスに適用できない特性であるとき、拡張継承が適用される。クラスAは有効クラスでなければならない
- 例えば、クラスMOVING_POINTは図形クラスPOINTから継承し、速度情報が追加されたものとか
- ファンクショナルバリエーション継承と型バリエーション継承 214
- 無効化継承 216
- 定義:BがAの有効な特性を再定義し、暫定特性にする場合、無効化継承が適用される
- 無効化の基本的な考え方は継承の通常の方向とは逆だけど、適用できるケースがある
- 具体化継承 217
- 定義:Aが一般的な種類のデータ構造を表し、Bがその種類のデータ構造の部分的または完全な実現の1つを表す場合、具体化継承が適用される。Aは暫定クラスである。Bは、後継者によるさらなる具体化の余地を残すために暫定クラスでも良いし、有効クラスでも良い
- 例えばTABLEクラスがあって、後継者にSEQUENTIAL_TABLEやHASH_TABLEがあるとか。さらにSEQUENTIAL_TABLEにはARRAYED_TABLE、LINKED_TABLE、FILE_TABLEがあるとか
- 構造継承 217
- 定義:A(暫定クラス)が一般的な構造上の属性を表し、B(暫定クラスでも有効クラスでも良い)がその属性を持つ特定の種類のオブジェクトを表す場合、構造継承が適用される
- 例えばクラスCOMPARABLEから継承した場合とか
- 具体化継承ではBはAと同じ概念を表すが、構造継承ではBは独自の抽象で、その抽象の独自の一面(数えられるとか比較できるとか)を継承する
- 実装継承 218
- 定義:BがBに関連する抽象の実現に必要な特性(定数属性とonceファンクションを除く)をAから獲得する場合、実装継承が適用される。AとBの両方が有効クラスでなければならない。
- 共有性質継承 219
- 定義:AがBなどの後継者の利益になる一群の論理的に関連する特性を提供する目的のためだけに存在する場合、共有性質継承が適用される。一般的な変形は次の2つである
- 定数継承。Aの特性がすべて共有するオブジェクトを表す定数か、onceファンクションである
- マシン継承。Aの特性がルーチンで、それらのルーチンはある抽象的なマシンの操作として見ることができる
- 例えばクラスEXCEPTIONSを継承するとか。定数は例外コードで、ルーチンは例外を起こすためのthrowとか
- 定義:AがBなどの後継者の利益になる一群の論理的に関連する特性を提供する目的のためだけに存在する場合、共有性質継承が適用される。一般的な変形は次の2つである
まだ自分はこれらのカテゴリについてちゃんと理解できてはいないけど、継承を見た時や使う時にこのどれに当たるのかを考えた上で使えるとさらに理解が深まりそうだなと思った。
まとめ
とにかくいい本なので読んだほうが良い。少なくとも上巻だけでも。
ただし、この本を理解するには、ある程度プログラムを書いていて、かつ静的型のある言語を少しでも触っている必要がありそう。そうでなければ挫折してしまうと思う。もしあまり理解できないなあと思ったら、リーダブルコードやコードコンプリート、インターフェース指向設計、リファクタリングなど、もう少しどうやったらプログラムを綺麗に書けるかについて学べる本を読み、さらにプログラムを書く経験を積んで再度挑戦してみると良いと思う。