软件构造复习11-面向健壮性的构造ch6
6.1健壮性和正确性
健壮性:系统在不正常输入或不正常外部环境下仍能表现正常的程度
尽可能保持软件运行而不是总退出
对用户更加友好
正确性:程序按照spec加以执行的能力
永不给出用户错误的结果
对程序员更加友好
这两种特性往往有一些矛盾,在实际使用中,要根据具体情况进行权衡
对外接口,倾向于健壮性
对内的实现,倾向于正确性
可靠性=健壮性+正确性
6.2 错误与异常处理
见lab4 基础知识–java异常处理
unchecked – error RuntimeException
程序员检查
checked Exception:FileNotFound EOF
编译器检查
如果父类型中的某个方法声明中未throws任何checked异常,那么子类型中override该方法时,在override方法内部抛出或捕获的任何异常必须被在方法内捕获并处理
checked Exception 需要出现在spec中
unchecked Exception 则不需要
如果采用try(…){…}的语法,则不再需要finally{…}了
6-3 断言与防御式编程
在开发阶段的代码嵌入,检验某些“假设”是否成立。若成立,表明程序正常运行,否则表明存在错误
代码需要的功能不要写在断言中
开发阶段使用断言
执行、发布后不要使用断言
Spotbugs
静态代码分析工具
6.4 Debug
四种策略
Instrumentation 测量
print log
Divide and Conquer 分治
Program Slicing切片
如果发现某函数输出的某变量a与期望不一致,那么对该函数代码中可能导致变量a的值发生变化的一部分代码进行仔细分析,以发现潜藏bug。
Delta Debugging 寻找差异
两个测试用例,测试结果分别是“通过”和“不通过”。
那么,利用EclEmma代码覆盖度工具观察两个测试用例所覆盖的代码行,找出二者的差异,bug很可能就隐藏在差异的代码行里。
针对一个bug修改代码之后,要重新运行之前发现该bug的所有测试用例,已确认该bug是否被完全修复
6-5 Testing
