Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation Microsoft代码契约框架有多成熟?_Validation_.net 4.0_Code Contracts_Microsoft Contracts - Fatal编程技术网

Validation Microsoft代码契约框架有多成熟?

Validation Microsoft代码契约框架有多成熟?,validation,.net-4.0,code-contracts,microsoft-contracts,Validation,.net 4.0,Code Contracts,Microsoft Contracts,微软最近在Devlab上发布了他们的框架,并获得了商业许可。我们有兴趣在我们的项目中使用它们(主要是C#,一些C++/CLI)来逐渐取代所有自定义验证代码,但我很想知道在我们承诺之前其他人在这方面的经验,特别是: 您认为该框架对于大型和复杂的商业项目是否足够成熟 您在使用时遇到了什么问题 你从中得到了什么好处 现在的痛苦是否超过了它的价值 我意识到这是一个有点主观的问题,因为它需要意见,但鉴于此框架是.NET 4.0的一个非常重要的组成部分,并且(可能)会改变我们编写验证代码的方式,我希望这

微软最近在Devlab上发布了他们的框架,并获得了商业许可。我们有兴趣在我们的项目中使用它们(主要是C#,一些C++/CLI)来逐渐取代所有自定义验证代码,但我很想知道在我们承诺之前其他人在这方面的经验,特别是:

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

  • 您在使用时遇到了什么问题

  • 你从中得到了什么好处

  • 现在的痛苦是否超过了它的价值

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

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

请注意,我们不提供代码API,只提供web服务API,因此对于大多数代码来说,抛出异常类型方面的破坏性兼容性并不是一个问题。然而,由于我希望更多的人而不仅仅是我能从这篇文章及其答案中受益,所以这方面的任何细节都是非常受欢迎的。

根据我的判断,它还不够成熟,无法用于企业级项目。我自己并没有使用过它,但人们仍然会遇到一些bug,这些bug会使您的合同关键项目停止。这似乎是一个非常棒的框架,他们提供的示例视频非常令人兴奋,但我会等待:

  • 社区论坛的存在。您将希望能够与其他开发人员讨论您遇到的不可避免的问题,并且您希望知道有相当强大的开发人员基础与您讨论解决方案
  • 一个成功的试点项目发布。一般来说,当微软研究院发布一些他们认为足够成熟的产品用于商业项目时,他们将与一个组织合作进行试点,然后将该项目开源发布,作为概念证明和所有主要功能的试用。这将使人们对大多数常见合同场景都已涵盖并发挥作用充满信心
  • 更完整的文档。简单明了,在某些情况下,您可能会希望使用Microsoft代码合同来处理一些您还无法使用的合同。您希望能够快速而清楚地说明您的场景还不受支持的原因。但是,在我看来,当前的文档将让您不断猜测和尝试不同的事情,这将导致大量的时间浪费

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

当你在一个完全隔离的环境中工作,只有你自己的代码和基本类型,但一旦你开始使用BCL类(直到.NET4.0都没有自己的契约),契约的事情似乎很好验证器无法检查它们是否会违反任何requires/assures/invariants,因此您会收到很多关于潜在未满足约束的警告

另一方面,它确实发现了一些无效的或潜在的未满足的约束,这些约束可能是真正的bug。但很难找到这些,因为噪音太大,很难找到可以修复的。通过使用假设机制可以抑制来自BCL类的警告,但这有点自欺欺人,因为这些类将来会有合同,并且假设会降低它们的价值


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

它还不够成熟

一旦微软发布了价格合理的VS版本,它就会出现,但是如果没有静态代码分析,它就根本不可用

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

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


史诗般的失败。

上一次对此的成熟回应是在2009年,而.NET 4已经过时。我想我们应该更新一下:

对于调试版本,代码契约可能已经足够成熟。

我意识到这是从“无害”到“基本无害”的升级

链接到PDF格式的完整文档。本文档概述了第5节中的使用指南。总之,您可以选择您对契约工具在发布版本中重新编写IL有多勇敢

我们正在使用“不要重写我的发布IL”模式

到目前为止,我最享受的是这个意想不到的好处:代码更少,因此要测试的代码也就更少了。你所有的保护条款都消失了

if(arg != null) { 
    throw new ArgumentNullException("arg"); 
}
// Blank line here insisted upon by StyleCop
变成:

Contract.Requires(arg != null);
你的功能比较短您的意图更加清晰。而且,您不再需要编写名为Argumentshouldbenull的测试来达到100%的覆盖率

到目前为止,我遇到了两个问题:

  • 我有一个单元测试,它依赖于合同失败而成功。你可能会说测试的存在是一个错误,但我想以测试的形式记录这一特定的禁止。在我的生成服务器上测试失败,因为我没有安装工具。解决方案:安装工具

  • 我们正在使用两个重写IL的工具:一个