如何将防御性编程技术结合在一起?

时间:2011-09-04 11:06:18

标签: c# assert code-contracts defensive-programming fail-fast

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

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

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

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

2 个答案:

答案 0 :(得分:4)

您应该首先研究合同的(相当不错的)手册。

  • 它有关于单元测试集成的章节和示例代码。如果你按照Pex链接了解更多信息。
  • 总是在所有公共成员中使用合同。私人会员:有时候。
  • 您仍然可以使用Debug.Assert(),但Contracts.Assert()将是更合理的选择。
  • 示例项目......不知道任何。但请查看为BCL定义的合同。

答案 1 :(得分:4)

我会完全接受预览博客中的合同,并阅读更长的pdf文档。

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

你的函数测试用例会在合同前/后调用函数测试函数,并且不变调用会做他们的事情。

明确3种使用方案,哪种方案适用于您的代码及其问题。理想情况下,您可以在生产代码中运行它们,然后根据性能测试进行缩减。

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

我也喜欢DevExpress CodeRush和Refactor!专业工具。它们具有针对合同的特定重构,例如几次点击以将输入参数转换为需求合同等。此外,它们还有一些很好的代码分析,可以提高代码质量。

您可以在此处查看包含合同的代码: https://searchcode.com/codesearch/view/14318515/

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

Henk在你的其他问题上做得很好。