4

假设我有这个:

[Pure]
public static TimeSpan Seconds(this int i)
{
    Contract.Ensures(Contract.Result<TimeSpan>() == TimeSpan.FromSeconds(i));
    return TimeSpan.FromSeconds(i);
}

我以如此严格的方式确保合同结果是正确的,还是不必要的?


在这种情况下?

[Pure]
public static T IfTrue<T>(this bool b, T value)
{
    Contract.Ensures(Contract.Result<T>().Equals(b ? value : default(T)));
    return b ? value : default(T);
}

我的问题是:

  1. 当我指出如此精确的合同保障时,我是对的吗?
  2. 我有义务做出如此严格的合同保证吗?为什么?
  3. 可以吗,我的合同保证重复(在我的申请中的许多情况下)return声明?
4

2 回答 2

4

想想“合同”这个词——在编写代码时,您希望向调用者保证什么(或者Requires,您希望他们为您保证什么)。

对于诸如您展示的那些微不足道的示例,我想不出您想包含多少合同。也许对于第一个,我会去:

[Pure]
public static TimeSpan Seconds(this int i)
{
    Contract.Requires(i>0);
    Contract.Ensures(Contract.Result<TimeSpan>().TotalSeconds > 0.0);
    return TimeSpan.FromSeconds(i);
}

我会向我的来电者保证我会产生积极的结果。显然,如果我在此方法中包含更复杂的数学,则可以给出类似的合同。我会保证范围,但我不会确切地保证结果是如何计算的(因为这可能会发生变化)。

于 2012-11-16T13:25:01.557 回答
0

方法纯度意味着,该方法调用不会导致任何调用者对对象状态产生可见的副作用。就是这样

当然,纯方法可以是公共的,并且可以定义自己的前置条件和后置条件。这取决于具体的方法用例。

于 2012-11-16T11:24:02.557 回答