プリミティブ引数と「複雑なデータ」の検証
引数の検証
メソッドを記述するときは、操作を実行する前に、まず引数を検証する必要があります。たとえば、人を表すクラスがあるとします。
public class Person
{
public readonly string Name;
public readonly int Age;
public class Person(string name, int age)
{
this.Name = name;
this.Age = age;
}
}
この Person クラスの何が問題になっていますか? name と age は、値が Person のフィールドとして設定される前に検証されません。「検証済み」とはどういう意味ですか? 両方の引数をチェックして、その値が許容可能であることを確認する必要があります。たとえば、name の値が空の文字列の場合はどうなるでしょうか。それとも age の値が -10 ですか?
引数の検証は、値が受け入れられない場合に ArgumentExceptions または派生例外をスローすることによって実行されます。例えば:
public class Person(string name, int age)
{
if (String.IsNullOrEmpty(name))
{
throw new ArgumentNullException
("name", "Cannot be null or empty.");
}
if (age <= 0 || age > 120)
{
throw new ArgumentOutOfRangeException
("age", "Must be greater than 0 and less than 120.");
}
this.Name = name;
this.Age = age;
}
これにより、 Person のコンストラクターが受け取る引数が適切に検証されます。
退屈で吐き気がする
あなたは長い間引数を検証してきたので (そうですか?)、すべてのメソッドで if (....) throw Argument... ステートメントを書くのにうんざりしているでしょう。