TL;DR

ルーチンが満たすべき条件を表明(アサーション)としてコードに書き、ルーチンと呼び出し側の間の「契約」として扱う設計手法。英語では Design by Contract(DbC)と呼ぶ。

なぜ必要か

仕様をコードそのものに書くので、仕様書とコードを別々に保守する必要がなくなる。契約は実行時に検査できるので、違反があればすぐに例外として分かる。

仕組み

Eiffel のドキュメントでは、契約を次の表明で表す。

  • 事前条件: ルーチンを実行する前に成り立っていなければならない条件。呼び出し側が守る。違反するとルーチンの本体は実行されず、呼び出し側に事前条件違反が返る
  • 事後条件: ルーチンが正しく終わったあとに成り立つべき条件。ルーチン側が守る
  • クラス不変条件: そのクラスのインスタンスが常に満たすべき状態。不変条件を参照

例

Eiffel のドキュメントにある set_second は、秒を設定するルーチンである。事前条件で引数が 0 以上 59 以下であることを求め、事後条件で second が受け取った引数と等しくなっていることを確かめる。

関連

出典