最近,我开始使用.net代码合约。在我看来,代码合约的思想本身很棒,但实现起来非常不愉快。
我不喜欢它的主要原因是:
- 我只能在我的程序中使用像
Contract.Require()
这样的方法。ContractAbbreviator
有很多限制(例如,我不能将它们放在单独的程序集中,也不能使用参数),这使它们不太可用。没有属性和扩展方法,所以我的代码变得非常冗长。例如,如果我只想检查我的返回类型为Dictionary<string,string>
的返回值不为空,我需要添加一个怪物,如Contract.Ensure(Contract.Result<Dictionary<string,string>>!= null)
。它甚至不可读。 - 静态分析器发出了许多错误警报,我花费的时间比修复实际问题还要多。
- 它非常慢。即使它有一些缓存,但分析一个小项目仍需要几分钟,这使其对增量修复无用。它只需要太长时间。
ccrewriter
中存在漏洞-它无法处理一半的程序集,并且无法在.net 4.5运行时中生存.net 4.0程序集。- 存在运行时/静态检查器二元性。当我刚开始时,我认为它就像
Debug.Assert
-您只需在感觉需要的地方添加它们即可。但事实证明,我需要向静态检查器证明所有内容,这肯定是先进的,但有时检查器很愚蠢,无法解决许多明显的代码结构(例如while
)。而且没有工具可以告诉分析器“我知道自己在做什么,请忽略此合同违规行为”。 - 您无法关联条件。例如,无法向静态分析器解释如果我检查
string.NotNullOrEmpty
,则包括string!= null
。或者,如果我有自己的大型过程来检查文件路径,我无法向分析器解释它肯定不为空且不为空。ContractAbbreviator
属性有点帮助,但所有这些冗长的内容都在那里,看起来仍然很糟糕和愚蠢。 - 代码合同的开发非常缓慢,即使现在它是开源的,据我所知,代码库也处于糟糕状态。