(View this PageEdit this PageUploads to this PageHistory of this PageHomeRecent ChangesSearch the SwikiHelp Guide)
[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)
が肝となる。


ここで、「契約によるプログラミング」というのは、preconditionを守れば
(ルーチン使用者の義務)、postconditionを守ります。(ルーチン実装者の責任)
みたいなことをいう。

欧米人的思考で考えれば、確かにこれは「契約」ですね。
目的は、ルーチンのロジックにエラー処理などの副次的処理を持ち込んで、
ロジックを不用意に汚さないため。とか、不具合発生時の切り分け(責任所在の
明確化)らしい。

この各種条件は、継承でも継承先に当然持ち込まれるし、クラスの変更時にも
この条件が守られる(ように変更すべきということです)。
(XP的なUnitTestの繰り返しに通ずるものがある。)
さらに、ドキュメンテーションとしての効果がある。だって、ソースみれば
すぐに、前提条件がわかるでしょ。

     #define preCondition( c )      assert ( c )
     #define postCondition( c )     assert ( c )



私が思うに、上位クラスの縛り方が重要かもしれない。
基底クラスとなるべきものでがちがちちに縛っちゃえば、拡張性にかけてしまう
でしょ。
でもかな〜りよく検討すれば、基底となるクラスで縛るべきものは見えてくる
はずだし、派生先は基底の縛り+派生先のしばりという形で自然な形となるはず。
(つまり、下手をするとすごく下位のクラスでは、ぎちぎちで身動きがとれんと
いう状況にもなりかねない。この場合は、設計が悪いのだからしょうがない。
といって、上位の縛りを緩和するのは危険です。だって、他の派生先で
この緩和が悪影響となるかもしれないでしょ?)


-----------

関連サイト

-----------

Links to this Page