CodeContracts使ってみた

契約プログラミングを.NETで実践するためのフレームワークです。
詳しいことはググってもらうとして、「このメソッドはこの範囲の値を指定しなさい」とか「このメソッドはこういう値を返しますよ」とか「このフィールドはいつもこういう状態ですよ」といった仕様をコードにしておくことでプログラム的に検証できるようにするもの、と捉えました。メソッド冒頭のnullチェックも似たようなものですが、それを統一した形で記述することでリリースバイナリから一括で除去したり、静的なチェックを行うことができます。
参考にしたページはこちら。
基礎からのCode Contracts
Visual Studio 2010 後の世代のプログラミング(1) Code Contracts | kazuk は null に触れてしまった
とある契約の備忘目録。契約による設計(Design by Contract)で信頼性の高いソフトウェアを構築しよう。 - Bug Catharsis
CLR 徹底解剖: コードの契約]
ところでこれらの記事に書かれている「Premiumじゃないと静的チェッカが使えない」という話ですが、昨年末から全エディションで使えるようになっています。

Release 1.4.412128.0 (December 28, 2011)
The static checker is now available in all editions of Visual Studio (except for Express), so there is now just one edition of Code Contracts.

http://research.microsoft.com/en-us/projects/contracts/releasenotes.aspx

やったねお兄ちゃん!
この静的チェックこそが本命のように思っている僕としてはぜひとも常用したいところですが、これを有効にするとビルドに時間がかかります(一分半ぐらい)。しかも契約チェックしてる間はVSがビジー状態になってしまいます。ティータイムですか。
その間VSが操作できないのがじれったいという私のような人は CodeContracts の設定で Check in Background をオンにしてしまいましょう。ビルド完了後にバックグラウンドでチェックを実行してくれます。
エラー一覧に表示されないという話も見かけましたが、チェックが終わり次第エラー一覧にも出力パネルにも表示されるのでご安心を。ただし通知はないので自分で確認しないといけません。
で、触ってみた感想。

  • 既存のプログラムでチェック有効にしてもあまり怒られないね
    • 事前条件書いてないから
    • 事前条件にして受け付けないか、黙認するかってところはあるかも
    • クラスライブラリは所々事前条件があるので怒られる
  • 設定がわけわからん(参考記事のスクリーンショットより増えてるし)
    • 頑張って英語ドキュメント読めばいいと思うよ
  • 今まで実行時チェックして例外吐いてきたものはどうしよう
    • それも付属ドキュメントにガイドライン
    • Requires は常に出力されるので*1バイナリリライタが必須になる
      • 事後条件でもないし、if-then-throwとして処理してくれればいいのにー
    • Requires と EndContractBlock では使える Assembly Mode が違うので併用できない

ところで契約と言ったら謎の白い生き物ですよね→/人◕‿‿◕人\

*1:他の契約は条件コンパイルされるので CodeContracts 使えない環境ではコードにならない、らしい