2012-11-16 75 views
4

比方說,我有這樣的一個:我應該對任何方法結果執行Contract.Ensures嗎?

[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. 我說得表明這種精確的合同ensurance什麼時候?
  2. 我是否有義務制定如此嚴格的合同保證,爲什麼?
  3. 是否可以,我的合同保證重複(在許多情況下在我的申請)return聲明?
+0

你想完成什麼? – gdoron

+0

我正在學習'代碼合同'。 – AgentFire

+0

這看起來好像太過分了。避免。 –

回答

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); 
} 

我會保證我的呼叫者,我會產生積極的結果。很明顯,如果我在這種方法中包含更復雜的數學,那麼可以給出類似的合同。我會對範圍給予保證,但我不能保證計算結果的確切程度(因爲這可能會發生變化)。

0

方法純度意味着,該方法調用不會導致任何調用者可見的副作用對象狀態。 這就是全部

當然,純方法可以是公開的,並且可以定義它自己的前後條件。它取決於具體的方法用例。

+0

問題更多地是關於'Contract.Ensures'的用法。你能告訴我這種方法必須在那裏嗎?爲什麼? – AgentFire

+0

@AgentFire:*什麼*方法和哪裏*有*?如果你的意思是在'[Pure]'方法中需要'Contract.Ensures',那麼答案是「否」。 「Contract.Ensures」可以放在「[Pure]」方法中嗎?是。當'Contract.Ensures'可以放在'[Pure]'方法中?這取決於具體的方法目的。 – Dennis

+0

好的,對不起,具體問題已更新。 – AgentFire

相關問題