2010-06-24 34 views
9

我一直在研究.NET 4.0 Code Contracts,并在关于这个问题的问题上寻找stackoverflow。.net 4.0代码合同。何时使用?他们什么时候浪费时间?

我还没有遇到任何使用代码合同的示例代码,这让我想知道..这真的很有用吗?或者,也许它唯一有用的代码达到了一定的复杂度?任何人在那里使用代码合同,真的很高兴他们做到了?

在我看来,所有的代码合同都是一个断言的方法,除了能够尝试找出在编译时进出的值的方法是什么... ...但是那么这将需要更多的代码在你所有的方法..是否值得吗?

我注意到的一个好处是,在我看来,你可以使用代码合同作为单元测试的第一行......然后当你编写单元测试可以避免编写一些更基本的测试,因为代码合同已经覆盖了......这是真的吗?

契约是否可以与WCF调用一起使用?我猜测没有,因为代理与您自动创建,你不能改变。

+0

我想知道这与ASP.NET验证器有什么关系?或者这个东西只适用于BLL? – punkouter 2010-06-24 16:13:43

回答

7

我随时使用它们,我需要验证一个输入参数需要具有特定的值(数字是正数,对象不为空)。

对于输出,我会在任何时候使用它们来确定返回值应该处于特定状态(例如不为null)。

通过代码中的契约,可以确保在出现意外值时立即抛出异常,并且不会在代码中由于意外假设而意外地将对象遗留在损坏状态的代码中。

就我个人而言,我认为它使代码更清洁。这个符号使得它更少写(而不是使用if(.... == null)....)。这种方式Contract.Requires在它正试图完成的事情中是非常先行的。当我看到我知道代码正在评估参数处于特定状态时。

+0

整体节省时间吗?你认为你使用断言的主要优点是什么? 我担心代码合同是我把所有的代码,但实际上它的矫枉过正,只是膨胀的代码,因为检查是非常明显的其中之一.. 我想我仍然在等待一个更好的例子'看到?它检查字符串是否为null!' – punkouter 2010-06-24 15:25:55

+4

无论如何,您应该验证您的输入。我认为这样可以节省时间,因为其他程序员很容易明白你的意图。你可以用if语句做同样的事情,但是Contract.Requires表明你正在验证一个输入。对于发生的事情没有猜测。另一个很酷的事情是,你可以定义合同在项目文件中的工作方式。在开发过程中,您可以将合同设置为在违规发生时立即停止程序。 – kemiller2002 2010-06-24 15:28:57

+0

代码合约在WCF中如何实现?它是否使用导出策略。您可以在代码合同用于业务验证时提供参考吗? – Lijo 2013-03-26 16:28:31

2

有合同的研究领域:http://en.wikipedia.org/wiki/Design_by_contract很久以前,它们被引入.net。

代码合同给予回答下列问题有用:

  • 什么方法期待?
  • 方法保证什么?
  • 方法维护什么?

如果您可以为这些问题写出小而可读的合同,然后使用它。

+0

所以如果一个项目开始,鲍勃做的UI和乔做的BLL ......是这种类型的设计,这样不仅将鲍勃和乔交换什么方法和参数..但我也是在UML(或无论)参数的允许值被定义......然后你在你的方法的顶部使用代码合约来添加这些验证......这将如何工作? – punkouter 2010-06-24 16:15:50

+0

类似的东西。它只是扩展验证。有一些工具可以将联系人提取到独立文档。 – Andrey 2010-06-24 18:07:45

2

其中一个使用CodeContracts的主要原因是为了使静态分析能够检测CodeContracts的违规行为,以便它们在运行时被及早发现而不会导致错误或未知行为。

如果需要,您可以禁用CodeContracts的运行时实施。

使用它们的另一个很好的理由是将合同定义添加到XML代码注释以增强API文档。这也适用于Sandcastle,尽管需要进行一些调整以充分整合它们。代码合同用户手册日期为2011年2月4日(或更晚)的第8.3节提供http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf