如何将防御性编程技术结合在一起?
Posted
技术标签:
【中文标题】如何将防御性编程技术结合在一起?【英文标题】:How to combine defensive programming techniques together? 【发布时间】:2011-09-04 11:06:18 【问题描述】:我想问你的问题很广泛,但同时也很具体。首先,我不得不说,我最感兴趣的是适用于 .net 环境的答案。
好吧,我想提高我生成的代码的级别。现在我主要使用 TDD 和静态代码分析来确保我的代码是正确的。最近我听了 Dino Esposito 关于代码合约的演讲,现在我想将它与其他技术结合使用。在听 Dino 的时候,我还想起了 Debug.Assert()
和 Trace.Assert()
。
具体来说,我会问几个问题:
我应该如何编写合同和单元测试以相互补充? 我应该在每个方法中还是只在公共方法中使用代码协定? 我应该阻止Debug.Assert()
的使用吗?什么时候可以使用它们? (例如,注意 .net 中的不变量仅在公共方法/属性退出时检查。那么,是否可以通过简单的Assert()
在方法中间进行一些检查?)
能否请您向我推荐一个开源项目,其中所有这些技术都被正确使用,因为一张图片描绘了一千个单词?
【问题讨论】:
我对@987654326@ 的问题是它永远无法投入生产。你只会在你的开发/测试环境中发现它的错误。如果断言将捕获的此类错误传播到野外,它将使您的复制变得更加困难。使用它而不是发布可用的断言是一个优化步骤,过早的优化永远不会是好的。 @Merlyn,AFAIK 你可以使用Trace.Assert()
而不是Debug.Assert()
。以下是 MSDN 所说的: > 默认情况下,Debug.Assert 方法仅适用于调试版本。如果您想在发布版本中进行断言,请使用 Trace.Assert 方法。
听起来更好。我仍然会考虑以经典方式抛出异常(这样您就可以获得错误报告),但至少您可以在所有构建中测试该代码路径。 编辑:重读MSDN页面,提示弹出消息框。这听起来像是一个可以报告的不错的软错误(因为它提供了堆栈跟踪)。总是有“如果我们处于这种状态,程序状态可以信任吗?”题。但这更多的是情境性的。
这篇文章是我的帮助 - ***.com/questions/2549639/…欢呼。
@Stephen 谢谢。我会看看那篇文章中的材料。
【参考方案1】:
您应该从学习(相当不错的)合同手册开始。
它有一个关于单元测试集成的章节和示例代码。如果您按照 Pex 链接了解更多信息。 始终在所有公共成员中使用合同。对于私人会员:有时。 您仍然可以使用 Debug.Assert() 但 Contracts.Assert() 将是更合乎逻辑的选择。 示例项目...不知道。但是请查看为 BCL 定义的合同。【讨论】:
我没用过代码合约,只听说过。 “对于私人成员:有时”如何与“例如,请注意 .net 中的不变量仅在公共方法/属性退出时检查”(来自 OP)?这些断言/约束会得到验证吗? Merlyn,该规则适用于不变量。大部分合同是关于前置条件和后置条件(.Requires() 和 .Ensures())。【参考方案2】:我会完全接受合同,就像在预览博客中一样,并通过阅读更长的 pdf 文档。
合同不仅适用于公共职能。最重要的是它为编译器提供了一种推理代码的方法。因此,请酌情在您的所有功能中使用它。这给你最大的好处。仅在公共功能中使用它就像说您只是在测试***功能。错了。
您的函数测试用例会在 Contract pre/post 和不变调用完成它们的事情之后清除函数中仍然需要测试的任何逻辑。
要清楚这 3 种使用场景(哪一种适用于您的代码)及其问题。理想情况下,您可以让它们在您的生产代码中运行,然后根据性能测试进行缩减。
确保您生成的文档包含您的合同,这是一个很好的好处。
我也喜欢 DevExpress CodeRush 和 Refactor!专业工具。他们对合约进行了特定的重构,例如单击几下即可将输入参数转换为需要的合约等。此外,它们还有一些不错的代码分析,总体上会提高您的代码质量。
您可以在这里查看一些带有合约的代码: https://searchcode.com/codesearch/view/14318515/
至于整个项目的最佳实践辣酱玉米饼馅。好吧,我在看你微软。啧啧。
Henk 很好地解决了你剩下的问题。
【讨论】:
以上是关于如何将防御性编程技术结合在一起?的主要内容,如果未能解决你的问题,请参考以下文章