10 Construction for Change
软件维护与演化 (Software Maintenance and Evolution)
-
软件维护 (Software Maintenance):
- 定义:软件交付后的修改,以修正错误或提高性能和其他属性。
- 类型:
- 纠错性维护 (Corrective Maintenance):修正已发现的问题。
- 适应性维护 (Adaptive Maintenance):在变化的环境中保持软件可用。
- 完善性维护 (Perfective Maintenance):提高性能或可维护性。
- 预防性维护 (Preventive Maintenance):在问题显现之前检测并修正潜在故障。
-
软件演化 (Software Evolution):
- 软件从初始版本到多个更新版本的持续开发和修改。
- Lehman’s Laws:软件变化的不可避免性、持续增长、质量下降和复杂性增加等。
可维护性的度量 (Metrics of Maintainability)
- 可维护性指标 (Maintainability Index):
- 基于Halstead Volume、圈复杂度、代码行数和注释行数计算出的指数,数值越高越易维护。
- 代码复杂度指标:
- 圈复杂度 (Cyclomatic Complexity):程序独立路径的数量,复杂度越高,测试和维护难度越大。
- 继承深度 (Depth of Inheritance):类层次结构的深度,越深越难理解。
- 类耦合度 (Class Coupling):类之间的依赖程度,耦合度高的设计难以维护。
模块化设计与模块化原则 (Modular Design and Modularity Principles)
-
模块化编程 (Modular Programming):
- 目标是将程序功能分解为独立、可互换的模块,每个模块执行特定功能。
- 高内聚低耦合:模块内的功能应紧密相关,模块之间的依赖应尽量减少。
-
评估模块化的五个标准 (Five Criteria for Evaluating Modularity):
- 可分解性 (Decomposability):是否可以将大组件分解为小组件。
- 可组合性 (Composability):是否可以将小组件组合成大组件。
- 可理解性 (Understandability):每个组件是否容易理解。
- 可持续性 (Continuity):小的变化是否只影响少数模块。
- 保护性 (Protection):运行时异常是否仅限于少数模块。
-
模块化设计的五个规则 (Five Rules of Modularity Design):
- 直接映射 (Direct Mapping):模块结构应与问题领域的结构相对应。
- 少接口 (Few Interfaces):模块之间的通讯应尽量少。
- 小接口 (Small Interfaces):模块之间交换的信息应尽量少。
- 显式接口 (Explicit Interfaces):模块之间的通讯应明显、公开。
- 信息隐藏 (Information Hiding):应隐藏易变的设计决策在抽象接口之后。
面向对象设计原则:SOLID (OO Design Principles: SOLID)
- 单一职责原则 (Single Responsibility Principle, SRP):每个类应只有一个引起其变化的原因。
- 开放封闭原则 (Open/Closed Principle, OCP):软件实体应对扩展开放,对修改封闭。
- 里氏替换原则 (Liskov Substitution Principle, LSP):子类应能够替换父类。
- 接口隔离原则 (Interface Segregation Principle, ISP):应多个特定客户端接口,而不是一个通用接口。
- 依赖倒置原则 (Dependency Inversion Principle, DIP):高层模块不应依赖低层模块,二者都应依赖抽象。
基于语法的构造技术 (Grammar-based Construction)
- 语法和解析器 (Grammar and Parser):
- 语法定义了编程语言的合法结构。
- 解析器根据语法分析代码结构。
- 正则表达式 (Regular Expression):
- 用于匹配文本模式的工具,常用于字符串搜索和操作。
总结
本章强调软件维护的重要性以及如何通过模块化设计和面向对象的设计原则提高软件的可维护性和扩展性。它介绍了衡量可维护性的多种指标,并探讨了几种面向维护和变化的设计与构造技术。通过采用这些技术和原则,可以在软件生命周期的早期阶段有效地考虑到未来的变化,从而降低维护成本,提升软件质量。