『オブジェクト指向入門 第2版』の6章を読んだ

第6章 抽象データ型

オブジェクトの記述の仕方に,物理的な表現をする方法と,抽象データ型(ADT)を用いる方法がある.まず,物理的な表現をする場合を考える.

ここでは,スタックを例に挙げる.スタックの表現として,配列を用いる場合とリストを用いる場合が考えられる.また,配列を用いる場合,インデックスが小さい方を先頭とする場合と,大きい方を先頭とする場合が考えられる.これら3つの表現からひとつを選ぶのは,過剰仕様(情報隠蔽ができていない)の典型的なケースである.操作するデータの物理的な構造とプログラムが密接に結びつける,すなわち,特定の表現を仕様として使うと,柔軟性が低くなってしまう.

オブジェクトを中心に見るためには,操作や属性に注意を向ける必要がある.スタックの操作として,以下が考えられる.

スタックに対する操作を記述したものの,これでは非形式的で長期間の使用には耐えない.次に,スタックのADTの仕様を形式的に記述してみる.

仕様は,4つの段落から構成される.

スタックの仕様記述

仕様を形式的に書くと,以下のようになる.

型はSTACK[G]STACK[G]である.Gは仮総称パラメータで,実際に利用する際には具体的な型(実総称パラメータ)を与える.FUNCTIONSでの "\nrightarrow" は,一部のみ適用可能であることを示す.PRECONDITIONSにあるように,removeremoveitemitemはスタックが空だと値を返せない.AXIOMSはFUNCTIONSに含まれる操作が満たさなければならない条件である.

クラス

ADTを考えることで,次はクラスについて考えることができる.

クラスは(部分的であっても良い)実装を伴う抽象データ型である。

ADTという概念を,コンピュータ向けに実装したのがクラスである.ここでは,完全に実装されているクラスを有効クラスは,それ以外を暫定クラスと呼ぶ.

有効クラスには,以下の3つによって構成される.

  1. ATDの仕様記述(スタックの仕様記述で記述したもの)
  2. 表現の選択
    実装上のデータ形式.スタックでいうと,配列やリスト.
  3. 関数から表現への対応
    これは,特性と呼ばれるメカニズムの集合として表される.具体的な実装を示す.

情報隠蔽の点では,2と3は非公開にすべきである.

オブジェクト指向によるソフトウェア構築

オブジェクト指向では,操作するオブジェクトの型から導かれるモジュールを基本にアーキテクチャを構築すると述べた.これは,以下のように言い換えることができる.

オブジェクト指向によるソフトウェア構築とは、抽象データ型の(その部分的な実装も含む)構造化された集合として,ソフトウェアシステムを構築することである.

ソフトウェア構築において,基本となるのがATDである.ただし,本当に必要なのはATDの実装である.これらの実装は,完全である必要はない.

システムはクラスの集合なので,トップやメインプログラムはない.クラス群は,顧客と継承によって構造化されている.