就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果你觉得这个问题可以改进并可能重新打开,visit the help center 寻求指导。
8年前关闭。
如果您必须选择 最喜欢的 (聪明的)技术进行防御性编码,它们会是什么?虽然我目前的语言是 Java 和 Objective-C(有 C++ 背景),但可以随意用任何语言回答。这里的重点是巧妙的防御技术,而不是我们这里 70% 以上的人已经知道的技术。所以现在是时候深入挖掘你的技巧了。
换句话说,试着想想除这个 之外无趣的 例子:
if(5 == x)
而不是 0x2518122313431intended 19 19 避免未分配 19 19 19 19以下是一些 有趣的 最佳防御性编程实践的示例(特定于语言的示例在 Java 中):
- 锁定您的变量,直到您知道需要更改它们
也就是说,您可以声明所有变量
if(x == 5)
,直到您知道需要更改它为止,此时您可以删除 final
。一个普遍不为人知的事实是,这对方法参数也有效:public void foo(final int arg) { /* Stuff Here */ }
- 当坏事发生时,留下证据
当您遇到异常时,您可以做很多事情:很明显,记录它并执行一些清理工作就很少了。但是您也可以留下证据(例如,将变量设置为“无法加载文件”或 99999 之类的标记值在调试器中很有用,以防您碰巧跳过异常
final
-block)。- 在一致性方面:细节决定成败
与您正在使用的其他库保持一致。例如,在 Java 中,如果您正在创建一个提取一系列值的方法,则使下限包含在内,上限不包含在内。这将使其与
catch
等以相同方式运行的方法保持一致。您会在 Sun JDK 中发现所有这些类型的方法都以这种方式运行,因为它进行各种操作,包括与数组一致的元素迭代,其中索引从零(包含)到数组的长度(不包含)。那么,你最喜欢的一些防守做法是什么?
更新:如果你还没有,请随时加入。在我选择正式答案之前,我会给更多回复的机会。
最佳答案
在 C++ 中,我曾经喜欢重新定义 new 以便它提供一些额外的内存来捕获栅栏发布错误。
目前,我更喜欢避免防御性编程,而更喜欢 Test Driven Development 。如果您在外部快速捕获错误,则无需通过防御性操作来弄乱您的代码,您的代码是 DRY -er 并且您最终需要防御的错误更少。
As WikiKnowledge Wrote:
关于language-agnostic - 最喜欢的(聪明的)防御性编程最佳实践,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/490420/