『オブジェクト指向入門 第2版』の6章を読んだ
第6章 抽象データ型
オブジェクトの記述の仕方に,物理的な表現をする方法と,抽象データ型(ADT)を用いる方法がある.まず,物理的な表現をする場合を考える.
ここでは,スタックを例に挙げる.スタックの表現として,配列を用いる場合とリストを用いる場合が考えられる.また,配列を用いる場合,インデックスが小さい方を先頭とする場合と,大きい方を先頭とする場合が考えられる.これら3つの表現からひとつを選ぶのは,過剰仕様(情報隠蔽ができていない)の典型的なケースである.操作するデータの物理的な構造とプログラムが密接に結びつける,すなわち,特定の表現を仕様として使うと,柔軟性が低くなってしまう.
オブジェクトを中心に見るためには,操作や属性に注意を向ける必要がある.スタックの操作として,以下が考えられる.
- put
スタックに要素を追加する. - remove
スタックの一番上の要素を取り除く. - item
スタックの一番上の要素が何かを調べる問い合わせ. - make
スタックを作成する.
スタックに対する操作を記述したものの,これでは非形式的で長期間の使用には耐えない.次に,スタックのADTの仕様を形式的に記述してみる.
仕様は,4つの段落から構成される.
- TYPES
関数,公理,及び事前条件によって特徴付けられるオブジェクトの集合. - FUNCTIONS
TYPESが示す型のインスタンスに適用可能な操作. - AXIOMS
関数の動作を示す属性. - PRECONDITIONS
操作を適用するために満たさなければならない条件
スタックの仕様記述
仕様を形式的に書くと,以下のようになる.
- TYPES
- FUNCTIONS
- AXIOMS
任意のに対して - PRECONDITIONS
型はである.G
は仮総称パラメータで,実際に利用する際には具体的な型(実総称パラメータ)を与える.FUNCTIONSでの "" は,一部のみ適用可能であることを示す.PRECONDITIONSにあるように,とはスタックが空だと値を返せない.AXIOMSはFUNCTIONSに含まれる操作が満たさなければならない条件である.
クラス
ADTを考えることで,次はクラスについて考えることができる.
クラスは(部分的であっても良い)実装を伴う抽象データ型である。
ADTという概念を,コンピュータ向けに実装したのがクラスである.ここでは,完全に実装されているクラスを有効クラスは,それ以外を暫定クラスと呼ぶ.
有効クラスには,以下の3つによって構成される.
- ATDの仕様記述(スタックの仕様記述で記述したもの)
- 表現の選択
実装上のデータ形式.スタックでいうと,配列やリスト. - 関数から表現への対応
これは,特性と呼ばれるメカニズムの集合として表される.具体的な実装を示す.
情報隠蔽の点では,2と3は非公開にすべきである.
オブジェクト指向によるソフトウェア構築
オブジェクト指向では,操作するオブジェクトの型から導かれるモジュールを基本にアーキテクチャを構築すると述べた.これは,以下のように言い換えることができる.
オブジェクト指向によるソフトウェア構築とは、抽象データ型の(その部分的な実装も含む)構造化された集合として,ソフトウェアシステムを構築することである.
ソフトウェア構築において,基本となるのがATDである.ただし,本当に必要なのはATDの実装である.これらの実装は,完全である必要はない.
システムはクラスの集合なので,トップやメインプログラムはない.クラス群は,顧客と継承によって構造化されている.