防御式的编程
4.1 保护程序免遭非法输入数据的破坏
通常有这几种方法来处理那些垃圾数据:
- 检查所有来源于外部的数据的值
- 检查子程序所有输入参数的值
- 决定如何处理错误的输入数据
防御式编程是本书所介绍的其他提高软件质量技术的有益辅助手段。防御式编码的最佳方式就是在一开始不要在代码中引入错误。使用迭代式设计、编码前先写伪代码、写代码前写测试用例、低层设计检查等活动,都有助于防止引入错误。因此,要在防御式编程之前优先运用这些技术。所幸的是,你可以把防御式编程和其他技术结合起来使用。
4.2 断言
断言是指在开发期间使用的、让程序在运行时自检的代码。
断言对于大型的复杂程序或可靠性要求极高的程序来说尤其有用。通过使用断言,程序员能更快速地排查出因修改代码或者别的原因,而弄进程序里的不匹配的接口假定和错误等。
一个断言通常含有两个参数:一个描述假设为真时的情况的布尔表达式,和一个断言为假时需要显示的信息。
正常情况下,你并不希望用户看到产品代码中的断言信息;断言主要是用于开发和维护阶段。通常,断言只是在开发阶段被编译到目标代码中,而在生成产品代码时并不编译进去。在开发阶段,断言可以帮助查清相互矛盾的假定、预料之外的情况以及传给子程序的错误数据等。在生成产品代码时,可以不把断言编译进目标代码里去,以免降低系统的性能。
4.3 使用断言的指导建议
下面是关于使用断言的一些指导性建议
- 用错误处理代码来处理预期会发生的情况,用断言来处理绝不应该发生的状况。断言是用来检查永远不该发生的情况,而错误处理代码是用来检查不太可能经常发生的非正常情况,这些情况是能在写代码时就预料到的,且在产品代码中也要处理这些情况。错误处理通常用来检查有害的输入数据,而断言是用于检查代码中的bug。
用错误处理代码来处理反常情况,程序就能够很从容地对错误做出反映。如果在发生异常情况的时候出发了断言,那么要采取的更正的措施就不仅仅是对错误做出恰当的反映了——而是应该修改程序的源代码并重新编译,然后发布软件的新版本。
- 避免把需要执行的代码放到断言中。如果你把代码写在断言里,那么当你关闭断言功能时,编译器很可能就把这些代码除排在外了。
- 用断言来注解并验证前条件和后条件。
- 对于高健壮性的代码,应该先使用断言再处理错误。