本文是对软件构造课程软件可复用性相关内容的整理与理解,使用的编程语言为 Java。我们首先讨论可复用的软件“应该是什么样的”,然后讨论“如何构造好的可复用的软件”。
什么是软件复用?
软件复用(software reuse)是使用已有的软件组件去实现或更新软件系统的过程。
软件复用的两个视角:
- 创造:系统地创造可复用的资源。
- 使用:复用资源,把它们作为构建新系统的积木。
为什么要复用呢?
创造可复用的而不是短暂的东西的动机,既有审美上的、智力上的,也有经济上的,这是人类渴望不朽的一部分。“它将人类与其他生物区分开来,并将人类文明社会与原始社会区分开来。”(Wegner,1989)
- 复用降低了成本和开发时间:通过缩短软件开发周期(用更少的人更快地开发软件)来提高软件生产效率;不浪费资源进行不必要的“重新造轮子(reinvent-the-wheel)”;降低维护成本(可以生产出质量更好、更可靠、更高效的软件)。
- 复用会产生可靠的软件:复用已经存在一段时间并经过调试的功能,这些功能往往经过充分测试,稳定可靠。
- 复用有利于标准化:复用 GUI 库会在应用程序中产生通用的外观;规则、一致、连贯地设计。
复用的成本
复用的成本是昂贵的:
- 从创造的角度:可复用的组件应以明确定义、开放的方式设计和构建,使用简洁的接口规范、可理解的文档,并着眼于未来的使用。做到这些,需要成本。
- 从使用的角度:涉及组织、技术和过程的变更,以及支持这些变更的工具的成本,以及培训人员使用新工具和变更的成本。
但随着软件规模的增大,复用的成本要比不复用的成本低得多。
如何衡量可复用性?
可复用性(reusability)意味着对构建、打包、分发、安装、配置、部署、维护和升级问题的一些显式管理。一个具有高度可复用性的软件应该满足以下要求:
- 小且简单
- 可移植且与标准兼容
- 灵活可变
- 可扩展
- 泛型与参数化
- 模块化
- 变化的局部性
- 稳定
- 丰富的文档和帮助
可复用组件的级别和形态
最主要的复用是在代码层面,这是大多数程序员与复用的联系。但软件构造过程中的任何实体都可能被复用:源代码级别、模块级别(类、抽象类、接口)、库级别(API、包)以及系统级别(框架)。
复用可以分为两种类型:
- 白盒复用(white box reuse):源代码可见,可修改和扩展。复制已有代码到正在开发的系统,进行修改。优点是:可定制化程度高。缺点是:对其修改增加了软件的复杂度