7

我正在努力加快代码合同的速度。我喜欢这个概念,但在实践中,我看不到在众多私有方法上添加 Contract.Requires 的价值,其中一些只有一两行长。

我可以在公共方法上看到这一点,但在私有类方法上,这似乎有点矫枉过正。

4

2 回答 2

10

您希望将合同应用于私有方法的主要原因是您是否正在利用静态分析。您经常会编写对您的私有方法做出隐含假设的代码(例如,此方法从不返回 null),静态证明者会向您指出这一点。然后,您可以将假设放在公共方法的主体中,也可以将其作为合同添加到私有方法中。后者通常更简洁,因为它允许您在多次使用该私有方法时重用契约隐含的假设。

就个人而言,我已经放弃了代码合同,直到它有机会进一步成熟。语法很尴尬(我们真的需要一个简单的表示,特别是不可为空的参数),你可以经历很多尝试来静态证明复杂的系统。不过,这是一个非常好的主意,我认为将对复杂静态分析的适当合同支持纳入 .NET(实际 CIL 元数据)中只是时间问题,在 C# 中具有本机语言支持,而不是作为一个笨拙的扩展来固定.

另外一个问题是,我认为从上到下,将合约应用于小型应用程序的过程非常有价值,包括私有和公共方法。当你完成让一切都证明的过程时,它揭示了你每天所做的许多隐含假设,甚至没有意识到。您还经常发现您从未考虑过的失败案例,因为您在设计合同时培养的心态突出了您做出假设的点,并鼓励您考虑是否有时会违反您的假设。我没有安排时间在日常工作中执行此操作,但我确实从我尝试代码合同的那段时间中学到了很多东西。

于 2013-06-11T20:30:18.020 回答
1

合同通常只在公共方法之前/之后检查。私有方法仅作为调用公共方法的一部分被调用,因此不需要单独检查它们。

http://en.wikipedia.org/wiki/Class_invariant

于 2013-06-11T20:21:50.890 回答