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 に答える