2021-02-22

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

第6章 抽象データ型

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

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

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

  • put
    スタックに要素を追加する.
  • remove
    スタックの一番上の要素を取り除く.
  • item
    スタックの一番上の要素が何かを調べる問い合わせ.
  • make
    スタックを作成する.

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

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

  • TYPES
    関数,公理,及び事前条件によって特徴付けられるオブジェクトの集合.
  • FUNCTIONS
    TYPESが示す型のインスタンスに適用可能な操作.
  • AXIOMS
    関数の動作を示す属性.
  • PRECONDITIONS
    操作を適用するために満たさなければならない条件

スタックの仕様記述

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

  • TYPES
    • STACK[G]STACK[G]
  • FUNCTIONS
    • put:STACK[G]×GSTACK[G]put: STACK[G] \times G \rightarrow STACK[G]
    • remove:STACK[G]STACK[G]remove: STACK[G] \nrightarrow STACK[G]
    • item:STACK[G]Gitem: STACK[G] \nrightarrow G
    • empty:STACK[G]BOOLEANempty: STACK[G] \rightarrow BOOLEAN
    • new:STACK[G]new: STACK[G]
  • AXIOMS
    任意のx:G,STACK[G]x:G, STACK[G]に対して
    • item(put(s,x))=xitem(put(s,x)) = x
    • remove(put(s,x))=sremove(put(s,x))=s
    • empty(new)empty(new)
    • not empty(put(s,x))not\ empty (put(s,x))
  • PRECONDITIONS
    • remove(s:STACK[G]) require not empty(s)remove(s: STACK[G])\ require\ not\ empty(s)
    • item(s:STACK[G]) require not empty(s)item(s:STACK[G])\ require\ not \ empty(s)

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

クラス

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

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

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

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

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

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

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

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

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

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

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