Microsoft Code Contracts框架有多成熟?

时间:2009-03-22 23:31:35

标签: validation .net-4.0 code-contracts microsoft-contracts

微软最近在DevLabs上发布了Code Contracts框架,并附有商业许可证。我们有兴趣在我们的项目中使用它们(主要是C#,一些C ++ / CLI)来逐步替换所有自定义验证代码,但我很想知道其他人在我们承诺之前使用它的经验,具体是:

  • 您认为该框架对于大型复杂的商业项目来说已经足够成熟了吗?

  • 使用它时遇到了什么问题?

  • 你从中获得了什么好处?

  • 目前是否比它的价值更痛苦?

我意识到这是一个有点主观的问题,因为它需要意见,但鉴于这个框架是.NET 4.0的一个非常重要的部分,并且(可能)改变了我们编写验证代码的方式,我希望这个问题将保持开放以收集有关该主题的经验,以帮助我做出具体的,可回答的问题的决定:

  

我们下个月应该开始使用吗?

请注意,我们不提供代码API,只提供一个Web服务,因此对于大多数代码在抛出异常类型方面的兼容性并不是一个问题。但是,正如我希望更多的人能够从这篇文章及其答案中受益,这个领域的任何细节都非常受欢迎。

4 个答案:

答案 0 :(得分:32)

对此的最后成熟回应是在2009年,而.NET 4已经出局。我想我们应该更新:

代码合同可能已经足够成熟,适用于您的Debug版本。

我意识到这有点从“无害”升级为“无害”。

Code Contracts home page指向PDF格式的完整文档。该文档概述了第5节中的使用指南。总而言之,您可以选择合约工具在您的发布版本中重写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 ContractsPostSharp。他们相处不太好。 PostSharp的2.0.8.1283解决了这个问题。不过,我会谨慎地评估任何两个IL重写工具是如何相处的。

到目前为止,其好处超过了危害。

解决其他答案中提出的过时问题:

  • Code Contracts的文档非常详尽,但令人遗憾的是PDF格式。
  • 微软至少有一个Code Contract forum
  • 如果您拥有任何VS2010许可证,则代码合同标准版是免费的。
  • .NET 4出局了。在实现泛型集合接口时,我遇到了Microsoft的合同。

答案 1 :(得分:9)

我在一个小而中等复杂的独立项目中更多地使用代码契约,它需要继承一些BCL类并使用其他类。

当你在一个完全孤立的环境中使用你自己的代码和原始类型工作时,合同似乎很棒,但是一旦你开始使用BCL类(直到.NET 4.0没有自己的合同),验证者无法检查它们是否会违反任何要求/确保/不变量,因此您会收到很多关于可能不满足约束的警告。

另一方面,它确实发现了一些无效或可能不满足的约束,这些约束可能是真正的错误。但是很难找到这些,因为噪音很大,很难找出你可以解决的问题。可以通过使用假设机制来抑制来自BCL类的警告,但这有点弄巧成拙,因为这些类将来会有合同,假设会减少它们的价值。

所以我的感觉就是现在,因为在3.5中我们试图构建一个验证器不能充分理解的框架,它可能值得等待4.0。

答案 2 :(得分:8)

根据this thread来判断,我认为它还不够成熟,无法用于企业级项目。我自己没有使用它,但是人们仍然遇到了一些错误,这会让你的合同关键项目陷入停顿。它似乎是一个非常棒的框架,他们提供的示例视频令人兴奋,但我会等待:

  • 社区论坛的存在。您希望能够讨论与其他开发人员遇到的不可避免的问题,并且您想知道有一个相当强大的开发人员基础在那里讨论解决方案。
  • 一个成功的试点项目发布。通常,当Microsoft Research发布他们认为足够成熟以便在商业项目中使用的内容时,他们将与组织合作进行试点,然后发布该项目开源作为概念证明和所有主要功能的试验。这可以让大多数人相信大多数常见的合同方案都可以使用。
  • 更完整的文档。简单明了,在某些时候,您可能希望使用Microsoft代码合同无法完成的合同。您希望能够快速而清晰地推断您的方案尚不支持。当前的文档会让您猜测并尝试不同的事情,但在我看来,这将导致浪费了很多时间。

答案 3 :(得分:2)

它还不够成熟。

一旦微软用经济版的VS发布它,但没有静态代码分析,它根本就无法使用。

拥有它的VS的版本非常昂贵,只有极少数人能够负担得起。

微软用他们的定价政策杀死了这个惊人的想法,这真是太遗憾了。我希望代码合同成为主流,但他们不会。

史诗失败。