验证-Microsoft Code Contracts框架有多成熟?

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

  • 您认为该框架对于大型和复杂的商业项目是否足够成熟?

  • 使用时遇到什么问题?

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

  • 目前是否比其应有的痛苦还要多?

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

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

请注意,我们不提供代码API,仅提供一种Web服务,因此对于大多数代码而言,就抛出的异常类型而言,破坏兼容性并不重要。 但是,由于我希望更多的人将从中受益,而这方面的任何细节都将受到欢迎。

4个解决方案
32 votes

对此的最后一次成熟响应是在2009年,.NET 4退出了。 我认为我们应该进行更新:

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

我意识到这是从“无害”到“最无害”的升级。

“代码合同”主页链接到PDF格式的详尽文档。 该文档在第5节中概述了使用指南。总而言之,您可以选择对Contract 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的工具:代码合同和PostSharp。 他们相处得不太好。 PostSharp的2.0.8.1283解决了该问题。 不过,我会谨慎地评估任何两种IL重写工具如何相处。

到目前为止,收益大于危害。

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

  • Code Contracts的文档非常详尽,但遗憾的是PDF。
  • 至少有一个Microsoft主持的Code Contract论坛。
  • 如果您拥有VS2010许可证,则Code Contracts Standard Edition是免费的。
  • .NET 4已发布。 在实现通用集合接口时,我遇到了Microsoft的合同。
Garth Kidd answered 2020-08-03T09:13:41Z
9 votes

我一直在一个小型但中等复杂的独立项目中处理代码契约,该项目需要从某些BCL类继承并使用其他类。

当您在只有您自己的代码和原始类型的完全隔离的环境中工作时,合同的事情看起来很棒,但是一旦您开始使用BCL类(直到.NET 4.0没有他们自己的合同),验证程序就无法检查 它们是否会违反任何需求/确保/不变式,因此您会收到有关可能未满足的约束的许多警告。

另一方面,它确实发现了一些无效或可能不满意的约束,这些约束可能是真正的错误。 但是很难找到这些,因为杂音太多,很难找出可以解决的问题。 通过使用假设机制可以抑制来自BCL类的警告,但这在某种程度上是自欺欺人的,因为这些类将来会签订合同,并且假设会降低其价值。

所以我的感觉是,因为在3.5中,我们正在尝试建立一个验证者无法充分理解的框架,因此值得等待4.0。

Greg Beech answered 2020-08-03T09:14:16Z
8 votes

从这个线程来看,我想说它还不够成熟,无法用于企业级项目。 我自己还没有使用过它,但是人们仍然遇到一些错误,这些错误会使您的合同关键型项目停滞不前。 看起来这是一个非常不错的框架,他们提供的示例视频令人兴奋,但我要等待:

  • 存在社区论坛。 您将要能够与其他开发人员讨论遇到的不可避免的问题,并且您想知道那里有相当多的开发人员可以与他们讨论解决方案。
  • 成功的试点项目发布。 通常,当Microsoft Research发布他们认为足够成熟以用于商业项目的产品时,他们将与组织合作进行试点,然后将该项目的开源内容发布为概念验证和逐项试验。 所有主要功能。 这将使大多数通用合同场景都已涵盖并且可以正常工作,这将使您充满信心。
  • 更完整的文档。 简单明了,在某些时候,您将要使用尚无法使用Microsoft Code Contracts的合同进行某些操作。 您希望能够快速明确地说明尚不支持您的方案。 我认为,当前的文档将使您猜测和尝试不同的事情,但这将导致大量的时间浪费。
JoshJordan answered 2020-08-03T09:14:51Z
2 votes

还不够成熟。

微软将在价格适中的VS版本中尽快发布该版本,但是如果没有静态代码分析,则根本无法使用。

拥有它的VS版本是如此之昂贵,以至于只有少数人能够负担得起。

微软以其定价政策扼杀了这个惊人的想法,这真是可耻。 我希望代码合同将成为主流,但不会。

史诗般的失败。

StormianRootSolver answered 2020-08-03T09:15:28Z
translate from https://stackoverflow.com:/questions/671809/how-mature-is-the-microsoft-code-contracts-framework