nfoQでは昨年からC#をベースにして契約による設計をサポートするSpec#(リンク)を取り上げている。契約による設計は静的型付けのように、コンパイル時に検証されないと一定の動作を実行することができないという考え方だ。契約は通常、事前条件・事後条件という形を取る。例えば引数や戻り値がnullでない、あるいは一定の範囲内の値であるという条件がそうだ。
Spec#のような完全に新しい言語の学習がディベロッパの負担にならないように、Microsoftは言語を意識しなくてもいいようにライブラリを開発していて、これはどの.NET言語でも利用することができる。さて、ある種の契約はアサーションに似ているがその実はかなり異なっている。契約は静的なコード解析を組み合わせているため、コンパイラの内部でも外部でも契約を用いることができ、テストフレームワークも利用できる。また契約は実行可能であり、それゆえデバッグバージョン時にはアサーションのように振る舞う。次の例について考えてみよう。
.NET 4でD言語みたいにDesign By Contractを意識したコードが書けるようになるらしい。
事前条件、事後条件を言語仕様に盛り込んでほしいと思っていたので嬉しい。
特に事後条件のサポートが嬉しい。
事前条件は、言語仕様に盛り込まれていなくても比較的実装しやすかっったのだが、事後条件は場合によってはちょっとめんどくさかったのだ。
あとはいつ出るのか。本当に盛り込まれるのか。かな。
VB.NETに関して
Option Contract On
なんてオプションが追加されたら、嬉しいかも。
デフォルトOffで良いけど。