我有几个关于代码合同及其使用最佳实践的问题。假设我们有一个类,其中包含几个属性(如下所示):
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不是明确需要的,但是没有任何理由使其为空,因此在setter中定义了合同。 在property2上定义契约是否会减少调用代码中的空检查? 这应该减少错误并提高代码的可维护性-这种假设是否正确?
如果正确,如何确保呼叫代码永远不会为空? 我在构造函数中使用Contract.Invariant(property2!= null); 或者在Init()中使用Contract.Ensures(property2!= null); 或者在setter中使用Contract.Ensures(property!= null)? (即,如果使用Contract.Ensures(property2!= null),则将其放在哪里?)
如果问题似乎很简单,请原谅。 我只是想听听您的想法和您认为的最佳实践。