- 本博客为哈工大计算机科学与技术学院大二软件构造课程的课件翻译。同时记录了部分本人上课时的学习笔记和感悟
- 该博客11800字左右,主题为1-2软件构造的质量目标,1-2软件构造的质量目标
- 由于水平有限,翻译可能不是特别流畅、通顺,并且存在一定错误,观点、笔记不一定完全正确,敬请各位批评指正!
外部和内部质量因素
- 外部质量因素:质量,如速度或易用性,它们在软件产品中的存在或缺失可以被用户检测到。
外部质量因素 影响 用户
- 其他适用于软件产品的品质,如模块化或可读性,都是内部因素,只有能够访问实际软件文本的开发人员才能察觉。
- 最后,只有外部因素起作用。
内部质量因素 影响 软件本身和它的开发者
- 但实现这些外部因素的关键在于内部因素:为了让用户享受可见的品质,设计者和实施者必须运用内部技术来确保隐藏的品质。
外部质量取决于内部质量
(1)外部质量因素
外部1:正确性
- 正确性是指软件产品执行其规范所定义的精确任务的能力。
- 正确性:最重要的质量指标
假设软件系统是分层开发的。每一层都保证它的正确性的前提是它的下层也是正确的。
-
确保正确性的方法:测试和调试
测试和调试:发现不正确、消除不正确 →Robustness (Chapter 6) -
防御性编程,比如类型和断言
旨在帮助构建从一开始就正确的软件,而不是将其调试到正确。→Robustness (Chapter 6 ) -
Formal approach: “check”, “guarantee” and “ensure”
- 用于形式化程序说明和验证的数学技术
- Formal Language, Graduate courses
External 2: Robustness
- 健壮性是软件系统对异常情况作出适当反应的能力
- 鲁棒性补充正确性。
- 正确性处理系统在其规范所涵盖的情况下的行为;
- 健壮性是该规范之外发生的事情的特征。
- 鲁棒性是确保如果出现此类情况,系统不会导致灾难性事件;它应该生成适当的错误消息,干净地终止执行,或者进入所谓的“优雅降级”模式。
- 健壮性:出现异常时不要“崩溃”
- 鲁棒性涉及到“异常情况”,即正常和异常情况的概念总是相对于某一规范(“normal”和“abnormal”是主观而非客观)
- 异常情况是指规范中没有涉及的情况
- 如果扩展规范,以前不正常的情况就会变成正常——即使它们对应的事件是您不希望发生的错误用户输入
- 在这种意义上,“正常”并不意味着“令人满意的”,而只是“在软件设计中为之计划的”。
- 虽然错误输入应该被称为正常情况乍一看似乎有些矛盾,但任何其他的方法都必须依赖主观标准,因此是无用的。(?????)
External 3: Extendibility
- 可扩展性(可扩展性)是减轻软件产品适应变化的规范。
- 可扩展性的问题是规模的问题
- 对于小程序来说,改变通常不是一个困难的问题;但是随着软件的发展壮大,它变得越来越难以适应。
- 一个大型的软件系统通常看起来像一个巨大的纸牌屋,在其中的任何一个元素可能导致整个大厦崩溃。
- 我们需要可扩展性,因为在所有软件的基础上都存在一些人为的现象,因此也存在一些变化无常的现象
- 传统的方法没有充分考虑变化,而是依赖于软件生命周期的理想视图,在这个视图中,初始分析阶段冻结需求,其余的过程致力于设计和构建解决方案。
- 提高可扩展性有两个基本原则:
- 设计简单:简单的架构总是比复杂的架构更容易适应变化。
- 分散化:模块越自治,一个简单的更改只影响一个模块或少数模块的可能性就越高,而不是触发整个系统的变化连锁反应。
External 4: Reusability
- 可重用性(可复用性)是充当许多不同应用程序构建的软件元素
- 对可重用性的需求来自于对软件系统通常遵循类似模式的观察;应该可以利用这种共性,避免对以前遇到的问题重新发明解决方案。
- 一个可重用的软件元素将适用于许多不同的开发。
- Don’t Repeat Yourself (DRY)
- Don’t Re-invent the Wheel
External 5: Compatibility
- 兼容性就是容易地将软件元素与其他元素组合在一起。
- 兼容性很重要,因为我们不在真空中开发软件元素:他们需要相互作用。
- 但是,由于他们对世界其他地区的假设相互矛盾,他们经常在互动方面遇到麻烦
- 一个例子就是许多操作系统支持的各种不兼容的文件格式。只有在文件格式兼容的情况下,程序才能直接使用他人的结果作为输入。(文件格式的兼容性)
- 兼容性的关键在于设计的同质性(保持设计的同构性),并在达成标准约定inter-program沟通。
兼容性的关键是标准化,特别是标准协议。标准化
- 方法包括
- 标准化的文件格式,如Unix系统中的每个文本文件都是字符序列。
- 标准化的数据结构,如在Lisp系统中,所有数据和程序都由二叉树(在Lisp中称为列表)表示
- 标准化的用户界面,在各种版本的Windows、OS/2和MacOS中,所有的工具都依赖于一个范例来与用户通信,基于标准组件,如Windows、图标等。
- 通过定义由软件操作的所有重要实体的标准化访问协议,可以获得更通用的解决方案。
External 6: Efficiency
- 效率是软件系统对硬件资源提出尽可能少的要求的能力,如处理器时间、占用内部和外部存储器的空间、通信设备使用的带宽。
- 如果软件不正确,效率并不重要(“不要担心它有多快,除非它也是正确的”)。
- 对效率的关注必须与其他目标(如可扩展性和可重用性)相平衡;
- 极端的优化使得软件如此专门化,以至于不适合更改和重用。
- 算法,I/O,内存管理,等等。
External 7: Portability
- 可移植性是指将软件产品转移到各种硬件和软件环境的方便性。
- 可移植性不仅解决物理硬件的变化,而且更广泛地解决硬件-软件机器的变化,我们真正编程的机器,包括操作系统、窗口系统(如果适用的话)和其他基本工具。
External 8: Ease of use
- 易用性(易用性)的各种背景和资历的人可以学习使用软件产品和应用它们来解决问题。
- 它还涵盖了安装、操作和监控的便利性。
- 如何向新手用户提供详细的指导和解释,而不烦扰只想直接开始工作的专家用户。
- 结构简洁
- 一个设计良好的系统,根据一个清晰的、经过深思熟虑的结构构建,往往比一个混乱的系统更容易学习和使用。
- 知道用户
- 一个好的设计人员必须努力理解系统的预期用户群体