2009-10-20 60 views
2

我剛剛注意到question中提到的警衛方法/類,我沒有真正從答案中得到這個概念。唉,喬恩Skeet鏈接到MS網站從未加載。幾次Google搜索似乎只產生產品,而不是軟件工程概念。什麼是守衛方法/類?

任何解釋和/或樣品將不勝感激。 (特別是從事物的淨側)

+0

從喬恩的答案鏈接適用於我 - 也許你應該再試一次:) – 2009-10-20 23:49:30

+0

這只是你:http://downforeveryoneorjustme.com/http://research.microsoft.com/en-us/projects/合同/ – 2009-10-20 23:56:13

回答

1

保護條款是面向方面的一部分編程,您可以在其中定義什麼是方法的允許輸入。根據我所知道的.Net實現(我沒有真正看過),你可以通過屬性來完成這個工作。

public static void NeverGetNull([ThisParamNotNull]MyClass i, [ThisParamNotNull]OtherClass j) 
{ 
    // Will never need to check for null values on i or j! 
} 

我真的知道來自Erlang的防護表達式,其中方法調度依賴於防護方法。我給一個略低於僞代碼來說明這一點:

myMethod(input i) where i is an int 
{ 
return i + 10 
} 
myMethod(input i) where i is an int and i > 10 
{ 
return i - 10 
} 

var i = myMethod(1) // returns 11 
var i = myMethod(i) // returns 1 

由於可能不是很明顯,你可以提供其中調度過程中評估的後衛的表現。很整齊,嘿?

+0

有趣。當輸入不允許時會發生什麼?比如在你的僞代碼例子中,你的值是-5? – 2009-10-21 00:18:30

+0

好吧,如果所有警衛都失敗了,那麼方法調用失敗。沒有匹配。這與您嘗試調用在C#中沒有匹配簽名的方法相同。但在我的例子中,-5是一個有效的輸入,所以首先你會得到5,然後15,第三次調用該方法將產生5.希望清除它? – Khanzor 2009-10-21 03:02:58

1

如果你沒有指定一個異常,那麼.NET將拋出RaiseContractFailedEvent,但你可以指定ArgumentOutOfRangeExceptionArgumentNullException

如果你看看喬恩斯基特的鏈接,在PDF文件,你會看到很多例子,一個是:

Contract.Requires(x ! = null); 

這是契約式設計,在這裏您可以指定前置或後置的一部分。好處是在使用輸入參數之前不必進行大量的驗證,並且它有助於調用函數知道結果將根據合同進行,因此,如果不允許字符串返回爲空,那麼在調用函數時,由於前提條件檢查,您不必測試null。