我剛剛注意到question中提到的警衛方法/類,我沒有真正從答案中得到這個概念。唉,喬恩Skeet鏈接到MS網站從未加載。幾次Google搜索似乎只產生產品,而不是軟件工程概念。什麼是守衛方法/類?
任何解釋和/或樣品將不勝感激。 (特別是從事物的淨側)
我剛剛注意到question中提到的警衛方法/類,我沒有真正從答案中得到這個概念。唉,喬恩Skeet鏈接到MS網站從未加載。幾次Google搜索似乎只產生產品,而不是軟件工程概念。什麼是守衛方法/類?
任何解釋和/或樣品將不勝感激。 (特別是從事物的淨側)
保護條款是面向方面的一部分編程,您可以在其中定義什麼是方法的允許輸入。根據我所知道的.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
由於可能不是很明顯,你可以提供其中調度過程中評估的後衛的表現。很整齊,嘿?
有趣。當輸入不允許時會發生什麼?比如在你的僞代碼例子中,你的值是-5? – 2009-10-21 00:18:30
好吧,如果所有警衛都失敗了,那麼方法調用失敗。沒有匹配。這與您嘗試調用在C#中沒有匹配簽名的方法相同。但在我的例子中,-5是一個有效的輸入,所以首先你會得到5,然後15,第三次調用該方法將產生5.希望清除它? – Khanzor 2009-10-21 03:02:58
這是一個典型的後衛條款使用情況是什麼樣的一個很好的破敗:
我從鏈接看了那篇文章,並誠實地從討論後,它似乎更像是如何不做守衛子句。 – 2009-10-21 00:24:19
如果你沒有指定一個異常,那麼.NET將拋出RaiseContractFailedEvent
,但你可以指定ArgumentOutOfRangeException
或ArgumentNullException
。
如果你看看喬恩斯基特的鏈接,在PDF文件,你會看到很多例子,一個是:
Contract.Requires(x ! = null);
這是契約式設計,在這裏您可以指定前置或後置的一部分。好處是在使用輸入參數之前不必進行大量的驗證,並且它有助於調用函數知道結果將根據合同進行,因此,如果不允許字符串返回爲空,那麼在調用函數時,由於前提條件檢查,您不必測試null。
從喬恩的答案鏈接適用於我 - 也許你應該再試一次:) – 2009-10-20 23:49:30
這只是你:http://downforeveryoneorjustme.com/http://research.microsoft.com/en-us/projects/合同/ – 2009-10-20 23:56:13