本文主要是介绍软件构造 6-1 Robustness and Correctness,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
6.1 健壮性与正确性
一. 健壮性
1. 健壮性:系统在不正常输入或不正常外部环境下仍能够表现正常的程度。
2. 面向健壮性编程有以下特征:
- 处理未期望的行为和错误终止
- 即使终止执行,也要准确 / 无歧义的向用户展示全面的错误信息
- 错误信息有助于进行
debug
3. Postel’s Law
- 总是假定用户恶意、假定自己的代码可能失败
- 把用户想象成白痴,可能输入任何东西。此时返回给用户的错误提示信息要详细、准确、无歧义
对自己的代码要保守,对用户的行为要开放。
4. 健壮性实现原则:
- 封闭实现细节,限定用户的恶意行为
- 考虑极端情况,没有“不可能”
二. 正确性
1. 正确性:程序按照 spec
加以执行的能力,这是最重要的质量指标。
2. 正确性与健壮性:
- 正确性:永不给用户错误的结果
- 健壮性:尽可能保持软件运行而不是总是退出
正确性倾向于直接报错 (error
),健壮性则倾向于容错 (fault tolerance
) 。
例如:
或者例如:
使用角度:
- 健壮性:让用户变得更容易:出错也可以容忍,程序内部已有容错机制
- 正确性:让开发者变得更容易:用户输入错误(不满足 precondition 的调用),直接结束。
接口角度:
- 面向真实用户的对外的接口、面向客户端(或可能被他人调用)的接口。其倾向于健壮性。
- 对内的接口(自己使用但别人不可能使用)。倾向于正确性。
三. 相关定义
1. 可靠性 = 健壮性 + 正确性
2. 相关术语:
- 错误 (
error ≈ mistake
) :程序员犯的错误 - 缺陷 (
defect
) :bug
的根源 - fault (
defect ≈ fault, bug
) - 失效 (
failure
) :运行时的外在表现(缺陷爆发、程序宕机)
因果关系:error → defect/fault/bug → failure
程序员犯错导致软件存在缺陷,导致软件运行时失效
四. 过滤缺陷、提升健壮性与正确性
编程时:
- :使用断言、防御性编程、代码评审、形式化验证等方法来编写具有健壮性和正确性目标的代码
编程后:
- 观察故障症状 (内存转储、堆栈跟踪、执行日志、测试)
- 识别潜在的错误 (错误定位,调试)
- 修复错误 (代码修订)
MTBF
平均失效间隔时间 (外部观察角度,直接):两次邻近的失效的平均时间间隔。
由于部分系统可以自我修复并且修复时不能访问系统,因此通常 MTBF 是两个时间的加和:修复时间 + 紧邻的失效时间。
残余缺陷率(内部观察角度,间接):每千行代码中遗留的 bug
的数量。
1-10 defects / kloc
0.1-1 defects / kloc
0.01-0.1 defects / kloc
Halstead Volume
:基于源代码中(不同的)操作符和操作数的数量的复合度量。
这篇关于软件构造 6-1 Robustness and Correctness的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!