21

我想问你的问题很广泛,但同时也很具体。首先,我不得不说,我最感兴趣的是适用于 .net 环境的答案。

好吧,我想提高我生成的代码的级别。现在我主要使用 TDD 和静态代码分析来确保我的代码是正确的。最近我听了 Dino Esposito 关于代码合约的演讲,现在我想将它与其他技术结合使用。在听 Dino 的时候,我还记得Debug.Assert()and Trace.Assert()

具体来说,我会问几个问题:

  • 我应该如何编写合同和单元测试以相互补充?
  • 我应该在每种方法中使用代码契约还是只在公共方法中使用代码契约?
  • 我应该阻止使用Debug.Assert()吗?什么时候可以使用它们?(例如,请注意 .net 中的不变量仅在公共方法/属性退出时检查。那么,是否可以通过简单的方法在方法中间进行一些检查Assert()?)
  • 您能否向我推荐一个开源项目,其中所有这些技术都被正确使用,因为一张图片描绘了一千个单词?
4

2 回答 2

4

您应该从学习(相当不错的)合同手册开始。

  • 它有一个关于单元测试集成的章节和示例代码。如果您按照 Pex 链接了解更多信息。
  • 始终在所有公共成员中使用合同。对于私人会员:有时。
  • 您仍然可以使用 Debug.Assert() 但 Contracts.Assert() 将是更合乎逻辑的选择。
  • 示例项目...不知道。但请查看为 BCL 定义的合同。
于 2011-09-04T21:12:41.030 回答
4

我会完全接受合同,就像在预览博客中一样,并通过阅读更长的 pdf 文档。

合同不仅适用于公共职能。最重要的是它为编译器提供了一种推理代码的方法。因此,请酌情在您的所有功能中使用它。这给你最大的好处。仅在公共功能中使用它就像说您只是在测试顶级功能。这是错的。

你的函数测试用例会在合约前/后和不变调用完成它们的事情之后清除函数中仍然需要测试的任何逻辑。

清楚这 3 种使用场景(哪一种适用于您的代码)及其问题。理想情况下,您可以让它们在您的生产代码中运行,然后根据性能测试进行缩减。

确保您生成的文档包含您的合同,这是一个很好的好处。

我也喜欢 DevExpress CodeRush 和 Refactor!专业工具。他们对合约进行了特定的重构,例如单击几下即可将输入参数转换为需要的合约等。此外,它们还有一些不错的代码分析,总体上会提高您的代码质量。

您可以在此处查看带有合同的一些代码: https ://searchcode.com/codesearch/view/14318515/

至于整个最佳实践辣酱玉米饼馅都在一个项目中。好吧,我在看你微软。啧啧。

亨克在你剩下的问题上做得很好。

于 2011-09-05T08:56:42.443 回答