我对代码合同及其使用的最佳实践有几个问题。假设我们有一个类,它有几个属性(例如,见下文):
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 对于对象的正常使用没有明确要求。
我有以下问题:
我是否应该为财产合同而烦恼2?因为 property2 不是必填字段,所以它是否应该有合同。就财产 2 签订合同是否表明该合同实际上是该物品正常使用所必需的;
即使没有明确要求 property2,也没有可能的理由让它为 null,因此在 setter 处定义了合同。在 property2 上定义合约不会减少调用代码中的空检查吗?这应该可以减少错误并提高代码的可维护性——这个假设是否正确?
如果是正确的,我如何确保调用 property2 永远不会为空的代码?我是否使用 Contract.Invariant(property2 != null); 还是构造函数中的 Contract.Ensures(property2 != null),或者 Init() 中的 Contract.Ensures(property2 != null),或者 setter 中的 Contract.Ensures(property != null)?(即如果使用 Contract.Ensures(property2 != null),它放在哪里)?
如果问题看起来很简单,我很抱歉。我只是在寻找对此事的想法,以及你们认为的最佳实践。