ネタ元 → オブジェクト指向のコードが追いにくい理由
ここでちらっと触れられてる 契約プログラミング(Programming By Contract) なんだけども。
関数の提供者と利用者との間に交わされる「契約をお互いに守りましょう」
ってダケのこと。ここでの契約とは:
- 事前条件(pre condition)
関数を呼ぶ側で守らなければならない条件。
たとえば平方根を求める関数 sqrt ならば、"引数が負であってはならない"とか。
- 事後条件(post condition)
関数がその終了時に守らなければならない条件
sqrt の"戻り値の二乗は引数に十分近くなくちゃならん"とか。
- 不変条件(invariant)
関数呼び出しの前と後とで保持されるべき条件
たとえばコレクションの"検索によって要素数が変化しちゃならん"とか。
EiffelやDでは上記の条件を満たしているかの検証を言語がサポートしてくれます。
不変条件はちょっくら面倒なんだけど、事前条件/事後条件はC/C++だと簡単。
ぶっちゃけ assert 一発です。
int square_root(int x) {
assert( x > 0 ); // 事前条件
...
assert( result*result <= x ); // 事後条件-1
assert( (result+1)*(result+1) > x ); // 事後条件-2
return result;
}
.NET だと Debug.Assert 使えばいいか。
...流行りませんねぇ。事前条件だけでも埋め込んでおけば
バグったとき"俺のせいじゃねぇ。間違ってんのはお前の方だ!"って
主張できるから原因の切り分けが楽なのにねぇ。