2013年11月14日木曜日

C#で契約プログラミング

NetFramework4で契約プログラミングがサポートされたのは知っていたが、高価なVisualStudioだけかと思っていた。ところがプロ版でも使えるということを知ったので、実験してみた。

まずVisualStudioに、拡張機能を追加する。

そして、コンソールアプリケーションを新規作成する。

using System.Diagnostics.Contracts;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 3;
            int b = 2;
            Console.WriteLine("{0} / {1} = {2}", a, b, Program.Div(a, b));

            Console.ReadLine();
        }

        public static int Div(int a, int b)
        {
            
            Contract.Requires(b != 0);                  // 入力の契約
            Contract.Ensures(Contract.Result() >= 0);   // 出力の契約

            return a / b;
        }
    }
}

プロジェクトのプロパティに、見慣れないものが??


わざとb=0にしてコンパイルすると・・・

static void Main(string[] args)
{
    int a = 3;
    int b = 0;
    
    Console.WriteLine("{0} / {1} = {2}", a, b, Program.Div(a, b));

    Console.ReadLine();
}



実行しなくても、ちゃんと契約違反を見つけてくれる!

面白い機能なのだが、漫坊的には採用NGの判定となった。
  1. ExpressEditionでコンパイルできない
    べつに拡張機能が使えるようにしろよ、とか言うつもりはないが、開発関係者全員がプロ版を使えるわけではないので、これは痛い。
    ソースの関連行が無効になってくれたらよいのだが。
  2. 重い
    こんな小さなソースでも、7秒くらいかかる。まるでVS2012のWPFデバッグ開始みたいだ。とても毎回実行したいと思わない。

ExpressEditionでビルドができて、MSBuildで自動化ができるようになったら、再び検討してみるつもりである。

0 件のコメント:

コメントを投稿