コード コントラクトとその使用法に関するいくつかの質問があります。いくつかのプロパティを持つクラスがあるとしましょう (以下の例を参照):
class Class1
{
// Fields
private string _property1; //Required for usage
private List<object> _property2; //Not required for usage
// Properties
public string Property1
{
get
{
return this._property1;
}
set
{
Contract.Requires(value != null);
this._property1 = value;
}
}
public List<object> Property2
{
get
{
return this._property2;
}
set
{
Contract.Requires(value != null);
this._property2 = value;
}
}
public Class1(string property1, List<object> property2)
{
Contract.Requires(property1 != null);
Contract.Requires(property2 != null);
this.Property1 = property1;
this.Property2 = property2;
}
public Class1(string property1)
: this(property1, new List<object>())
{ }
}
私が達成したいことについてのいくつかの説明:
(a) property1 は必須フィールドです。property2 は、オブジェクトの通常の使用には明示的に必要ありません。
次の質問があります。
property2 のコントラクトを気にする必要がありますか。property2 は必須フィールドではないため、コントラクトが必要です。property2 にコントラクトを置くことは、それが実際にオブジェクトの通常の使用に必要であることを示していますか?
property2 は明示的に必須ではありませんが、それが null になる理由は考えられないため、setter で定義されたコントラクトです。property2 でコントラクトを定義すると、コードを呼び出す際の null チェックが減るのではないでしょうか? これにより、バグが減り、コードの保守性が向上するはずです。この仮定は正しいですか?
それが正しい場合、property2 が決して null にならないようにコードを呼び出すにはどうすればよいですか? Contract.Invariant(property2 != null); を使用しますか? コンストラクターの Contract.Ensures(property2 != null) 、または Init() の Contract.Ensures(property2 != null) 、またはセッターの Contract.Ensures(property != null) ? (つまり、Contract.Ensures(property2 != null) を使用する場合、どこに配置されますか)?
質問が単純に見えたら申し訳ありません。この問題についての考えと、皆さんがベスト プラクティスと考えていることを探しています。