2009-10-20 85 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。