第五章 代码的可复用性——复用性的度量、形态、与外边观测
1. 面向/基于复用编程(Programing for/with reuse)
面向复用编程(Programing for reuse):是为了开发出可复用的软件。
基于复用编程(Programing with reuse):利用已有的可复用软件搭建应用系统。
以上是软件复用的两种观点,软件复用就是字面上的意思,使用现有的软件组件实现、更新软件系统的过程。
复用的优点:
- 降低了开发成本与时间成本。
- 复用的代码已经经过了充足的测试,代码可靠稳定。
- 标准化,在不同应用中其表现一致。
但开发可复用的软件也存在一定的缺点,比如由于需要适应更多的场景(足够的适应性),所以其针对性并不是很强,往往性能较差,而且开发成本也要高于一般软件成本。
如果是对已有软件进行开发,可复用的软件库,一定要进行有效的管理,还要记得这些往往大多数无法直接拿来使用,需要适配。(下一节中提到的设计模式就有一种针对这种情况的适配器模式Adepter)
计算可复用性需要考虑一下几种情况:
- 复用的机会有频繁?复用的场合有多少?
- 复用的代价如何?
其中包括搜索获取复用的代码(有足够的money没有?能不能找到?),适配拓展的代价,实例化代价,与其他软件部分相连的难度等等。
高复用化的代码应有以下特点:
- 软件规模小且简单。
- 与标准兼容
- 灵活可变
- 可拓展
- 泛型、参数化
- 模块化
- 变化的局部性
- 稳定
- 丰富的文档与帮助
源代码层面的复用:
虽然该处复用的最主要是在代码层面上,但是软件构造过程中任何实体都可能被复用,其包括需求、规约、数据、测试用例、文档等等。现来主要讨论代码复用。
代码复用主要分为两种:
- 白盒复用(white box reuse):源代码可见,可修改和拓展
特点:1. 赋值已有的代码当正在开发的系统中,进行修改
2. 可定制化程度高
3. 对其修改增加了软件的复杂度,且需要对其内部充分的了解。
- 黑盒复用(black box reuse):源代码不可见,不能修改
特点:1. 只能通过API接口来使用,无法修改代码。
2. 简单清晰
3.适应性差
系统层面的复用:
应用框架:一组具体类、抽象类、及其之间的连接关系。
开发者可以根据框架的规约,填充自己的代码,然后形成一个完整的系统。
开发者会根据框架特点,增加新代码,对抽象类进行具体化。
现在来介绍一个名为控制反转(Inverse of control)的概念:
特点是:
- 有第三方的容器来控制对象之间的依赖关系,而非传统实现中有代码直接操控。
- 控制权有代码中转到了外部容器,带来的好处就是降低了对象之间的依赖程度,提高了灵活性和可维护性。
可复用性的外部观测:
- 类型可变(Type Variation)
使用不同的类型且满足LSP(见下节) - 功能分组(Routine Grouping)
提供完备的细粒度操作,保证功能的完整性,不同的场景下复用不同的操作(及其组合) - 实现可变(Implementation Variation)
ADT有多种不同的实现,提供不同的representation(表现)和AF,但具有相同的spec(前后置条件和不变量),从而可以使用不同的应用场景 - 表示独立(Representation Independence)
内部实现可能会变化,但表示独立(客户端不受到影响,信息隐藏) - 共性抽取(Factoring Out Common Behaviors)
将共同的行为抽象出来,形成可复用实体