我刚刚注意到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