2008-05-22

オブジェクト指向入門 ([著]バートランド・メイヤー, [監訳]二木厚吉, [訳]酒匂寛/酒匂順子, [版]アスキー出版局)

「Design by Contract」について知るため「7章 ソフトウェア構築への体系的アプローチ」をざっと読み。この本、すでに第2版の翻訳も出ている(手元にもある)けれど、まずは原点である第1版の方から確認。

ちなみに、第1版では「契約による設計(DbC)」ではなく「契約によるプログラミング(Programming by Contract)」と表記されている。むろん、意味するところは同じ。

DbCとは・・・以下の3つの条件を表明(assertion)することである。

  • 事前条件 (precondition)
  • 事後条件 (postcondition)
  • クラス不変表明 (class invariant)

事前条件は、ルーチン(関数、メソッド、などなど)を呼び出す側を束縛するもので、呼び出しても良い状態を定義する。事後条件は、呼び出されるルーチン側を束縛し、制御を呼び出し側に返すときに保証しなければならない状態を定義する。クラス不変表明とはインスタンス(個々のオブジェクト)の状態に関係なく、満たされていなければならない条件のこと。

ごく簡単にまとめると、クラス/ライブラリを提供する側と使う側で決まりを作って守りましょう、ということ。単純に提供する側だけに関係する手法ではない。事前条件の確認は呼び出し側の責任とされている。

Eiffel ではこれらをスマートに記述する文法と、実行時の確実なサポートがあるのかもしれない。C/C++なら(Javaも?) assert マクロで引数チェックのようなテクニック(というかコーディング規約かもね)で実現することだし、xUnit なんかの単体テストで確認する方法もある。クラス不変表明は内部状態へのアクセスが必要だとするとクラスの外部から確認するのは難しいだろうね。となると assert 方式か。言語と環境によってはアスペクトを使うっていう手もある(らしい)。

0 件のコメント:

コメントを投稿