Chapter4:面向软件构造可复用性(Reusability)的方法
4.1可复用性的度量、形态与外部表现(Metrics,Morphology and External Observations of Reusability)
4-1节探讨可复用的软件应该“长什么样”,4-2节学习“如何构造”。
复用的4种形态级别:
- 源代码级别复用。
- 模块级别的复用:类/抽象类/接口
- 库级别的复用:API/包
- 系统级别的复用:框架
1.什么是软件的复用
硬件的复用:
软件复用:
- 面向复用编程:开发出可复用的软件。(从无到有)
- 基于复用编程:利用已有的可复用软件搭建应用系统。(从有到新)
复用的原因:
- 降低成本和开发时间。
- 经过充分测试,可靠,稳定。
- 标准化,在不同应用中保持一致。
复用的代价
不仅program for reuse代价高,某些情况下program with reuse代价也高。
开发复用的软件特点:
- 开发成本高于一般软件的成本:要有足够高的适应性。
- 性能差些:针对更普适场景,缺少足够的针对性。
使用已有软件进行开发的特点:
- 可复用软件库,对其进行有效的管理。
- 往往无法拿来就用,需要适配。
2.估量可复用性的性能
- 复用的机会有多频繁?服用的场合有多少?
- 复用的代价有多大?(搜索获取,适配扩展,实例化,与软件其他部分的互连的难度)
有价值的可复用性的特点:
- 小,简单。
- 与标准兼容。
- 灵活可变。
- 可扩展。
- 泛型、参数化。
- 模块化。
- 变化的局部性。
- 稳定。
- 丰富的文档和帮助。
3.可复用性组成的级别(Levels)和形态(morphology)
复用的级别:
- 最主要的复用是在代码层面。
- 但软件构造过程中的任何实体都可能被复用。(需求,设计/规约spec,数据,测试用例,文档)
代码复用的类型:
- 白盒复用:源代码可见,可修改和扩展。
- 黑盒复用:源代码不可见,不能修改。
白盒复用:
- 复制已有代码到开发的系统,进行修改。
- 可定制化程度高。
- 对其修改增加了软件的复杂度,且需要对其内部充分的了解。
黑盒复用:
1.只能通过API接口来使用,无法修改代码。
2.简单,清晰。
3.适应性差些。
可复用代码的来源:
- 组织内部代码库(Guava)
- 第三方提供的库(Apache)
- 语言自身提供的库(JDK)
- 代码示例
- 来自同事
- 已有系统内的代码
- 开源软件的代码
继承(Inheritance)
可能会重写存在的行为。
委托(delegation)
一个对象依赖于另一个对象的部分功能。
系统级别的复用:
框架(Frameworks):
- 一组具体类,抽象类,及其之间的连接关系。
- 只有"骨架",没有"血肉",可运行。
- 开发者根据framework的规约,填充自己的代码进去,形成完整系统。
**白盒框架:**通过代码层面的继承进行框架扩展。
**黑盒框架:**通过实现特性接口/delegation进行框架扩展