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

Gre*_*Gum 7 c# code-contracts

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

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

Dan*_*ant 10

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

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

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