読者です 読者をやめる 読者になる 読者になる

コードコントラクトもどき

.NET Framework 4.0 で追加予定の Code Contract が待ちきれず、メソッドのパラメータチェックでこんなクラスを使うようになった。

public static class Requires
{
    public static void NotNull<T>(T value, string paramName)
    {
        if (value == null)
        {
            throw new ArgumentNullException(paramName);
        }
    }

    public static void NotNullOrEmpty(string value, string paramName)
    {
        NotNull(value, paramName);
        if (string.IsNullOrEmpty(value))
        {
            throw new ArgumentException(
                string.Format("{0} に空の文字列を指定できません。", paramName),
                paramName);
        }
    }

    // 他にもいろいろ定義する
}

こんな感じで使っている。

public string Greet(string name)
{
    Requires.NotNull(name, "name");

    // なにかやる
}

if 文で直に書くよりも短いし、「null でないパラメータを渡せ!」っていうメッセージが強く伝わる、と思う。「Requires」っていう名前がポイント。

Code Contract みたいに、ビルド時にエラーを出してくれるわけじゃない。当たり前。単なるメソッドだもの。

こういった方法は、Enterprise Library や Managed Extensibility Framework のソースコードで見かけた。一般的な方法なんだろう。

追記

Code Contract 試してみたけど、デバッグ実行時にダイアログがばんばん出て、非常にウザかった。使い方が間違っているのか、それとも、そういうものなのか……。

public string Greet(string name)
{
    Contract.Requires<ArgumentNullException>(name != null, "name");

    // なにかやる
}

name が null のとき ArgumentNullException が発生すると思ったんだけどなぁ。