这个问题已经在这里有了答案:
11年前关闭。
今天上午,我们就防御性编程进行了精彩的讨论。我们进行了一次代码审查,其中传入了一个指针,但未检查该指针是否有效。
有些人认为只需要检查空指针。我质疑是否可以在更高级别上检查它,而不是通过它所通过的每种方法,并且对于null的检查是非常有限的检查,以检查该点另一端的对象是否不符合某些要求。
我理解并同意,对null进行检查总比没有好,但是在我看来,仅对null进行检查提供了一种错误的安全感,因为它的范围受到限制。如果要确保指针可用,请检查多个值是否大于null。
您在这方面有什么经验?您如何在代码中为传递给从属方法的参数编写防御措施?
最佳答案
在有关错误处理的章节中的Code Complete 2中,向我介绍了路障的概念。本质上,路障是严格验证所有输入的代码。路障内部的代码可以假定已经处理了所有无效输入,并且接收到的输入是正确的。在街垒内部,代码只需要担心街垒中其他代码传递给它的无效数据。声明条件和进行明智的单元测试可以提高您对受限制代码的信心。这样,您可以在路障上非常防御性地进行编程,而在路障内部则要少一些。另一种思考的方式是,在路障中,您始终可以正确处理错误,而在路障中,您仅可以在调试版本中声明条件。
就使用原始指针而言,通常最好的办法是断言指针不为null。如果您知道该内存中应该包含什么内容,则可以确保内容在某种程度上是一致的。这就引出了一个问题,即为什么该内存没有包装在可以验证其自身一致性的对象中。
那么,为什么在这种情况下使用原始指针呢?使用引用或智能指针会更好吗?指针是否包含数字数据,如果这样,最好将其包装在管理该指针生命周期的对象中吗?
回答这些问题可以帮助您找到一种更具防御性的方法,因为最终您将获得一种更易于防御的设计。