はい、経験則があります。コード分析ツールは、このための良い出発点です。
問題のコードに関する経験則:
コレクション プロパティのセッターを許可するのは悪い習慣です。これは、空のコレクションをコード内の完全なコレクションと同じように扱うのが簡単だからです。コレクションに対してnullチェックを強制すると、あなたは打ちのめされます。次のコード スニペットを検討してください。
public bool IsValid(object input){
foreach(var validator in this.Validators)
if(!validator.IsValid(input)
return false;
return true;
}
このコードは、バリデータのコレクションが空かどうかに関係なく機能します。検証が必要な場合は、バリデーターをコレクションに追加します。そうでない場合は、コレクションを空のままにします。単純。コレクション プロパティを null にすることを許可すると、上記の悪臭を放つコード バージョンが生成されます。
public bool IsValid(object input){
if(this.Validators == null)
return false;
foreach(var validator in this.Validators)
if(!validator.IsValid(input)
return false;
return true;
}
コード行が増え、エレガントさが低下します。
次に、コレクション以外の参照型の場合、プロパティ値を設定するかどうかを決定する際に、オブジェクトの動作を考慮する必要があります。プロパティの既定値が明確に 1 つだけ存在するかどうか。または、プロパティの null 値には有効な意味がありますか?
あなたの例では、セッターで Name 値を常にチェックし、null が割り当てられたときにデフォルトの "(No name given)" に設定したい場合があります。これにより、このオブジェクトを UI にバインドするときに簡単になる場合があります。または、有効な名前が必要なため名前が null である可能性があり、最初に名前を設定せずに呼び出し元がオブジェクトに対してアクションを実行しようとすると、名前を確認して InvalidOperationException をスローします。
プログラミングのほとんどのことと同様に、何かを行うにはさまざまな方法があり、その半分は悪いものであり、残りの半分の各方法は特定の状況でのみ有効です。