微软最近在DevLabs上发布了他们的Code Contracts框架并获得了商业许可.我们有兴趣在我们的项目中使用它们(主要是C#,一些C++/CLI)来逐步替换所有自定义验证代码,但我很想知道其他人在我们承诺之前使用它的经验,特别:
您是否认为该框架对于大型复杂的商业项目而言已经足够成熟?
使用它时遇到了什么问题?
你从中得到了什么好处?
它目前是否比它的价值更痛苦?
我意识到这是一个有点主观的问题,因为它需要意见,但鉴于这个框架是.NET 4.0的一个非常重要的部分,并且(可能)改变了我们编写验证代码的方式,我希望这个问题将会留下开放以收集有关该主题的经验,以帮助我做出具体的,可回答的问题的决定:
我们下个月应该开始使用吗?
请注意,我们不提供代码API,只提供Web服务,因此对于抛出异常类型方面的大多数代码打破兼容性并不是一个问题.然而,正如我希望更多人而不仅仅是我将受益于这篇文章及其答案,这个领域的任何细节都非常受欢迎.
对此的最后成熟回应是在2009年,而.NET 4已经出局.我想我们应该更新:
对于您的Debug版本,代码契约可能已经足够成熟.
我意识到这有点从"无害"升级到"无害".
该代码契约主页链接到PDF格式的相当完整的文档.该文档概述了第5节中的使用指南.总而言之,您可以选择您对Release Tools在Release版本中重写IL的感觉.
我们正在使用"不要重写我的Release IL"模式.
到目前为止,我最喜欢这个意想不到的好处:代码更少,因此测试的代码更少.你所有的防守条款都消失了.
if(arg != null) { throw new ArgumentNullException("arg"); } // Blank line here insisted upon by StyleCop
变为:
Contract.Requires(arg != null);
你的功能更短.你的意图更清楚了.并且,您不再需要编写名为ArgumentShouldNotBeNull的测试,以达到100%的覆盖率.
到目前为止,我遇到了两个问题:
我有一个单元测试依赖合同失败成功.你可能会认为测试的存在是一个大错,但我想以测试的形式记录这个特殊的禁令.我的构建服务器上的测试失败,因为我没有安装工具.解决方案:安装工具.
我们使用两个重写IL的工具:Code Contracts和PostSharp.他们相处不太好.PostSharp的2.0.8.1283解决了这个问题.我会谨慎评估如何将任何两架IL-重写工具相处,虽然.
到目前为止,其好处超过了危害.
解决其他答案中提出的过时问题:
Code Contracts的文档非常详尽,但令人遗憾的是PDF格式.
至少有一个由Microsoft托管的代码合同论坛.
如果您拥有任何VS2010许可证,则Code Contracts Standard Edition是免费的.
.NET 4已经发布.在实现泛型集合接口时,我遇到了Microsoft的合同.
我已经在一个小而中等复杂的独立项目中更多地使用代码契约,它需要继承一些BCL类并使用其他类.
当你在一个完全孤立的环境中使用你自己的代码和原始类型工作时,合同似乎很棒,但是一旦你开始使用BCL类(直到.NET 4.0没有自己的合同),验证者就无法检查它们是否会违反任何要求/确保/不变量,因此您会收到很多关于可能不满足约束的警告.
另一方面,它确实发现了一些无效或可能不满足的约束,这些约束可能是真正的错误.但是很难找到这些,因为噪音很大,很难找出你可以解决的问题.通过使用假设机制可以抑制来自BCL类的警告,但这有点弄巧成拙,因为这些类将来会有合同,假设会减少它们的价值.
所以我的感觉就是现在,因为在3.5中我们试图构建一个验证器不能充分理解的框架,它可能值得等待4.0.
从这个线程来看,我会说它还不够成熟,无法用于企业级项目.我自己没有使用它,但是人们仍然遇到了一些错误,这会让你的合同关键项目陷入停顿.这似乎是一个非常棒的框架,他们提供的示例视频令人兴奋,但我会等待:
存在社区论坛.您将希望能够讨论与其他开发人员遇到的不可避免的问题,并且您想知道有一个相当强大的开发人员基础来讨论解决方案.
一个成功的试点项目发布.通常,当Microsoft Research发布他们认为足够成熟以便在商业项目中使用的东西时,他们将与组织合作进行试点,然后将该项目开源发布为概念证明并逐个试用所有主要功能.这将给予很多信心,大多数常见的合同方案都被覆盖并且有效.
更完整的文档.简单而简单,在某些时候,您将要使用Microsoft代码合同无法完成的合同.您希望能够快速而明确地推断您的方案尚不受支持.目前的文档会让你猜测和尝试不同的东西,但在我看来,这将导致大量的浪费时间.