2026-10-25 22:47:02
一、防御式编程
最好的防御:不要引入bug。
在编码过程中,应尽可能遵循最佳实践,减少bug的产生。
限制bug范围:
如果无法完全避免bug,应尝试将其限制在最小的范围内,如一个方法或小模块内部,避免其扩散。
尽快让程序在出现错误时失败,这样更容易发现和修复bug。
检查前置条件:
检查前置条件是防御式编程的一种典型形式,确保方法在被调用前满足特定的条件。
二、断言(assert)
定义:
断言是在开发阶段的代码中嵌入的,用于检验某些“假设”是否成立。
如果假设成立,程序继续正常运行;如果假设不成立,则抛出AssertionError,表明内部某些假设被违反了。
使用形式:
assert condition;:简单的断言形式,仅检查condition是否为true。
assert condition : message;:在condition为false时,显示message,便于快速定位错误。
使用范围:
主要用于内部不变量、RI(代表不变关系)、控制流不变量(如switch-case的default分支)、方法的前置条件和后置条件。
注意事项:
断言主要用于开发阶段,避免引入和帮助发现bug。
在实际运行阶段,应关闭断言,以避免降低性能。
不要将功能性代码写在condition里面,应先将返回值接收,再对返回值进行断言。
对于外部问题(如文件丢失),不应使用断言,而应使用异常机制处理。
开启与关闭:
Java中,断言默认是关闭的。要开启断言,可以在运行时添加参数-enableassertions或-ea;要关闭断言,可以使用-disableassertions或-da。
在Eclipse中,可以通过“Run Configurations”对话框中的“VM arguments”来开启或关闭断言。
三、断言与异常的区别
保证正确性 vs 保证健壮性:
断言更倾向于保证程序的正确性,用于检查“绝不应该发生”的情况。
异常更倾向于保证程序的健壮性,用于处理“预料到可以发生”的不正常情况。
使用场景:
如果参数来自外部(不受自己控制),应使用异常处理。
如果参数来自自己所写的其他代码,可以使用断言来帮助发现错误(如后置条件)。
public方法的前置条件:
按照惯例,public方法上的前置条件是通过抛出特定的、指定的异常的显式检查来进行的。
可以使用断言来测试非公共方法的前置条件,但通常这样的方法也不写规约。
四、防御式编程的策略
对外部数据源的检查:
对来自外部的数据源(如文件、网络数据、用户输入)要仔细检查。
对每个函数的输入参数合法性要做仔细检查,并决定如何处理非法输入。
设置路障与隔离舱:
设置路障(隔栏)是一种容损策略,起到防火墙的作用。
类的public方法接收到的外部数据都应被认为是dirty的,需要处理干净再传递给private方法,这就是隔离舱的作用。
操作间技术:
东西在进入操作间之前要进行一系列处理,确保数据的正确性和安全性。
Proxy设计模式:
Proxy设计模式是一种隔离方式,可以用于在访问对象之前进行一系列的检查和处理。
五、防御式编程的缺陷
六、其他工具


以上即为软构6-3的笔记内容,涵盖了防御式编程、断言、异常处理以及防御式编程的策略和缺陷等方面。希望这些内容对你有所帮助。