









[blog]
[ML]
[todo]
[CVS]
[bug]
[apache log]
[swiki log]
[statistics]
[map]
[man]
[info]
[アンテナ]
契約によるプログラミング
英語では、"Programming by contract"という。

どうも Eiffelで生み出された概念であるらしい。
基本的には、表明(assertion)、事前条件(precondition)、事後条件(postcondition)、クラス不変表明(class invariant)、
データ不変表明(data invariant)、実現不変表明(representation invariant)
が肝となる。
- assertion
- C言語でのassert()と同じ、要するに文字通り表明です。
- 例えば、絶対xが正でないとだめとかそういうの。Cで言えば、assert( x >= 0 )
- precondition
- 入力条件のことととっていいでしょう。要するにある条件を表明して、この条件でないとルーチンの入力値として受け付けないと表明すること。
- 例えばスタックの場合、スタックのバッファがfullである場合 pushはできないとか、空のスタックではpopができないとかそういうやつ。
- postcondition
- 出力として必ず満たされるべき条件
- 例えば、スタックの場合、pushしたら必ずバッファサイズが1以上だとか
- class invariant
- クラス内の属性(Eiffel用語)で守られるべき条件を表明する
- data incariant
- これは、「珠玉のプログラミング」より頂きました。ようするにデータが満たされるべき条件。例えば、スタックポインタは、必ず0以上、サイズ-1以下とか。
- representation invariant
- プログラミング実現のために、必須となる条件。クラス不変表明の1つで、どちらかと言えば、クラスによりモデル(現実の)を表現するために前提となる条件。
ここで、「契約によるプログラミング」というのは、preconditionを守れば
(ルーチン使用者の義務)、postconditionを守ります。(ルーチン実装者の責任)
みたいなことをいう。
欧米人的思考で考えれば、確かにこれは「契約」ですね。
目的は、ルーチンのロジックにエラー処理などの副次的処理を持ち込んで、
ロジックを不用意に汚さないため。とか、不具合発生時の切り分け(責任所在の
明確化)らしい。
この各種条件は、継承でも継承先に当然持ち込まれるし、クラスの変更時にも
この条件が守られる(ように変更すべきということです)。
(XP的なUnitTestの繰り返しに通ずるものがある。)
さらに、ドキュメンテーションとしての効果がある。だって、ソースみれば
すぐに、前提条件がわかるでしょ。
- C/C++言語では、assertマクロを有効に使うことで、同様のことができる。
- さらに、下記みたくdefineをきれば、それっぽいぞ!
#define preCondition( c ) assert ( c )
#define postCondition( c ) assert ( c )
- Javaでは、多分assertがないので、こういうふうにはできないが、XPのUnitTestしばりで同様の効果があるかもしれん。
- 他の言語でも、条件でthrowすれば、同じような感じか?
- Smalltalkでは、当然なんとでもなる。Objectとかで組み込んじゃえばいいでしょ?
- Eiffelとしては、言語仕様に組み込まれている。これが実際どのように効いてくるのかは、まだ不勉強でわかりません。
- すくなくとも、継承先に効いてくることには十分に意味があるね。
私が思うに、上位クラスの縛り方が重要かもしれない。
基底クラスとなるべきものでがちがちちに縛っちゃえば、拡張性にかけてしまう
でしょ。
でもかな〜りよく検討すれば、基底となるクラスで縛るべきものは見えてくる
はずだし、派生先は基底の縛り+派生先のしばりという形で自然な形となるはず。
(つまり、下手をするとすごく下位のクラスでは、ぎちぎちで身動きがとれんと
いう状況にもなりかねない。この場合は、設計が悪いのだからしょうがない。
といって、上位の縛りを緩和するのは危険です。だって、他の派生先で
この緩和が悪影響となるかもしれないでしょ?)

関連サイト

Links to this Page
- 書評:達人プログラマー last edited on 22 January 2003 at 12:25 pm
- プログラミングパラダイム last edited on 31 May 2004 at 10:17 pm
- 不変表明 last edited on 8 October 2002 at 12:03 pm
- プログラミング的概念 last edited on 1 June 2004 at 12:41 pm