>>15 Design By Contract
例えば、平方根を計算するメソッドは次にようになる。
long square_root(long x)
in { assert(x >= 0); }
out (result) {assert((result * result) == x);}
body {return math.sqrt(x);}
bodyが実際のメソッド本体。
inはこのメソッドに渡すパラメータに要求する条件。
この場合は、正の数でなければ平方根は計算できない。
outは、このメソッドが満たす条件。
平方根*平方根=元の数になるはずという意味。
このようにして「お前がこれこれの条件を満せば、
俺はこういう仕事をする」ということをソースに表現する。
inとoutを発注元が書いて、bodyを下請けが書く。
発注元が頭よければ下請けが馬鹿でも大丈夫。