コード契約やその使用に関するベストプラクティスに関していくつか質問があります。コード契約のベストプラクティス
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)のプロパティ1は必須項目です、我々はいくつかのプロパティ(例えば以下を参照)で、クラスを考えてみましょう。 property2は、オブジェクトの通常の使用に明示的には必要ありません。
私は、次の質問がある:
私もproperty2の契約を気にすべきです。 property2は必須フィールドではないため、契約を結ぶ必要があります。 property2に契約を置くことは、オブジェクトの通常の使用に実際に必要であることを示します。
property2が明示的に必要ではないにもかかわらず、それがnullである可能性はないので、定義されたコントラクトはセッターである。 property2の契約を定義しないと、呼び出しコードのヌルチェックを減らすことはできますか?これはバグを減らし、コードの保守性を向上させるはずです - この前提は正しいですか?
正しい場合は、property2が決してnullにならないようにするには、どうすればコードを呼び出すことができますか? Contract.Invariant(property2!= null)を使用しますか?コンストラクタ内のContract.Ensures(property2!= null)、またはInit()のContract.Ensures(property2!= null)、またはsetter内のContract.Ensures(property!= null)? (つまり、Contract.Ensures(property2!= null)を使用している場合は、どこに配置されていますか?)
質問が簡単なようであれば謝罪します。私はその問題に関する考えを探しているだけで、皆さんがベストプラクティスと考えるものを探しています。
私はあなたが記載されている理由のために財産上の2契約に同意します。 –