契約プログラミングの続き。引き続き理解が怪しい箇所がありましたらご指摘ください。前回は検証のためには事後条件が必要ということを再確認しました。前回のスイッチの例はON/OFFだけでしたが、オブジェクトは通常複数の属性(Adaの属性ではなくてオブジェクト指向で一般に言う属性)を持ちます。ややこしいのでオブジェクト指向の属性は以降プロパティと表記します。ようなものを考えます。標準ライブラリにあるやつを真似た感じで。ときのみ意味を持ちます。Adaには言語仕様としてのプロパティはありませんので関数で表現しています。使用例も適当に用意します。Main;この使用例を手動検証してみましょう。事前条件を満たしています。事前条件を満たしています。今どうなっているのかわかりません。連続して呼んでよいのかわかりません。事後条件を書き忘れていました。変わらないことが事後条件から確認できましたのでOKです。4から8も同じようにOKです。事前条件を満たせているかわかりません。ことを書く必要があります。変化しないことが事後条件から確認できました。事前条件を満たしています。これで不備はなくなりました。パラメータを持つサブプログラムの事後条件では毎回ほぼ全てのプロパティについて書かないといけなくなります。面倒くさいですね!ほぼ全てのプロパティを書き換えるサブプログラムなんて滅多にないわけです。滅多に変わらないプロパティを宣言できます。実際にはオブジェクトを引数に取る関数を指定します。滅多に変わらないプロパティだと宣言しました。事後条件を消すことができます。変わるかもしれないことを再宣言する必要があります。ついては再宣言の必要はありません。続けるように展開されます。例ですとこんな感じになるでしょうか。Randy先生の発案らしく(珍しく)SPARKからの逆輸入ではありません。そのため現バージョンのSPARKでこの例を試すことはできません。Eiffelにはない要素です。Eiffelでも事後条件を沢山書く必要があって面倒なことになっている......とは思えません。実際Eiffelのコードはかなりシンプルに見えます。なっているのでしょうか。実はEiffelの総本山の処理系EiffelStudio単独では静的検証はできず追加のアドオンを使う必要があるようです。そのひとつとしてEVEという検証器が存在しています。Contractsの関係等に近いのでしょう。SPARKがAdaにはない追加のpragmaやアスペクトを追加しまくっているのと同じようにEVEも追加の記述を必要とするようです。詳しく知りたい方はEVEのドキュメントを読んでいただくことにして私が斜め読みした結果を雑に書きます。EVEではmodelと呼ばれる仮想のプロパティを宣言できます。各ルーチン(サブプログラム)においてmodify_modelの宣言がなされたプロパティのみが変更できます。Self)の全てのプロパティを変更する、関数は何も変更しないと見做されるようです。合わせたようなもの......にイメージとしては近いのではないでしょうか。