代码合同 - 是否应该检查私有方法的前后条件?

时间:2013-06-11 20:18:13

标签: c# code-contracts

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

我可以在Public方法上看到这一点,但在私有类方法上,它似乎有些过分。

2 个答案:

答案 0 :(得分:10)

您希望将合同应用于私有方法的主要原因是您是否正在利用静态分析。您将经常编写对您的私有方法进行隐式假设的代码(例如,此方法永远不会返回null),静态证明器会将此指向您。然后,您可以将假设放在公共方法的主体中,也可以将其作为私有方法的合约添加。后者通常更清晰,因为它允许您在该私有方法的多次使用中重复使用合同所隐含的假设。

就个人而言,我已经放弃了代码合约,直到它有机会再成熟一些。语法很笨拙(我们确实需要一个非可空参数的简单表示),并且你可以通过大量的旋转试图使复杂的系统静态证明。这是一个非常好的主意,但我认为只有时间才能将复杂的静态分析的合适支持纳入.NET(实际的CIL元数据),在C#中使用本地语言支持,而不是而不是笨拙的延伸。

除此之外,我认为通过从上到下(包括私人和公共方法)将合同应用于小型应用程序的过程非常有价值。当你完成所有事情证明的过程时,它会揭示你每天所做的很多隐含的假设,甚至没有意识到。您还经常发现您从未考虑过的失败案例,因为您在设计合同时培养的心态突出了您做出假设的要点,并鼓励您考虑您的假设是否有时会被违反。我没有时间安排在我的日常工作中完成这项工作,但在我尝试代码合同期间,我确实学到了很多东西。

答案 1 :(得分:1)

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

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