微软最近在DevLabs上发布了Code Contracts框架,并附有商业许可证。我们有兴趣在我们的项目中使用它们(主要是C#,一些C ++ / CLI)来逐步替换所有自定义验证代码,但我很想知道其他人在我们承诺之前使用它的经验,具体是:
您认为该框架对于大型复杂的商业项目来说已经足够成熟了吗?
使用它时遇到了什么问题?
你从中获得了什么好处?
目前是否比它的价值更痛苦?
我意识到这是一个有点主观的问题,因为它需要意见,但鉴于这个框架是.NET 4.0的一个非常重要的部分,并且(可能)改变了我们编写验证代码的方式,我希望这个问题将保持开放以收集有关该主题的经验,以帮助我做出具体的,可回答的问题的决定:
我们下个月应该开始使用吗?
请注意,我们不提供代码API,只提供一个Web服务,因此对于大多数代码在抛出异常类型方面的兼容性并不是一个问题。但是,正如我希望更多的人能够从这篇文章及其答案中受益,这个领域的任何细节都非常受欢迎。
答案 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 Contracts和PostSharp。他们相处不太好。 PostSharp的2.0.8.1283解决了这个问题。不过,我会谨慎地评估任何两个IL重写工具是如何相处的。
到目前为止,其好处超过了危害。
解决其他答案中提出的过时问题:
答案 1 :(得分:9)
我在一个小而中等复杂的独立项目中更多地使用代码契约,它需要继承一些BCL类并使用其他类。
当你在一个完全孤立的环境中使用你自己的代码和原始类型工作时,合同似乎很棒,但是一旦你开始使用BCL类(直到.NET 4.0没有自己的合同),验证者无法检查它们是否会违反任何要求/确保/不变量,因此您会收到很多关于可能不满足约束的警告。
另一方面,它确实发现了一些无效或可能不满足的约束,这些约束可能是真正的错误。但是很难找到这些,因为噪音很大,很难找出你可以解决的问题。可以通过使用假设机制来抑制来自BCL类的警告,但这有点弄巧成拙,因为这些类将来会有合同,假设会减少它们的价值。
所以我的感觉就是现在,因为在3.5中我们试图构建一个验证器不能充分理解的框架,它可能值得等待4.0。
答案 2 :(得分:8)
根据this thread来判断,我认为它还不够成熟,无法用于企业级项目。我自己没有使用它,但是人们仍然遇到了一些错误,这会让你的合同关键项目陷入停顿。它似乎是一个非常棒的框架,他们提供的示例视频令人兴奋,但我会等待:
答案 3 :(得分:2)
它还不够成熟。
一旦微软用经济版的VS发布它,但没有静态代码分析,它根本就无法使用。
拥有它的VS的版本非常昂贵,只有极少数人能够负担得起。
微软用他们的定价政策杀死了这个惊人的想法,这真是太遗憾了。我希望代码合同成为主流,但他们不会。
史诗失败。