一.什么是可复用软件
定义:软件的复用是一个通过实用已经存在的软件的组件来实现或更新软件系统的一个过程。
从两个角度来看软件复用:
· 创造(Creation):面向复用的编程(Programming for reuse)——开发出可复用的软件。
· 使用(Use):基于复用的编程(Programming with reuse)——利用已有的可复用软件搭建应用系统
复用的好处:
· 降低成本和开发时间
· 经过充分的测试,可靠、稳定
· 标准化,在不同的应用之中保持一致
复用的代价:
· 复用的部分需要有着清晰的定义、开放的方法、简明的接口的规约、可理解的文档、并着眼于未来的使用
· 复用涉及到了组织、技术、过程的变化,同样也需要支持这些变化的工具和训练那些能使用工具来应对变化的人
开发可复用的软件:
因为软件要具有足够高的可适应性,因此开发成本要高于一般的软件。相对于其它软件而言,它的性能可能回更差,但是更具有普适性。
使用已有的软件进行开发:
可复用软件库,对其进行有效的管理
注意:对于复用的软件,需要进行适配
· 增加新的功能
· 移除不必要的功能
· 有些操作需要被修改
二. 如何衡量可复用性
复用的机会有多频繁(How frequently);复用的代价有多大(How much)
可复用性意味着一些明确的构建方式、包装、分发、安装、配置、部署、维护和升级的问题。
一个具有高复用性的软件应当具有以下特征:
· 小而简单——Brief and Simple
· 与标准兼容——Portable and Standard Compliance
· 灵活可变——Adaptable and Flexible
· 泛型、参数化
· 模块化——Modularity
· 变化的局部性
· 稳定
· 丰富的文档
三.不同层面的复用
最主要的复用是在代码层面。但是软件构造过程中的任何实体都可能被复用——需求、规约、数据、测试用例、文档。
我们关系四个层面的复用——
· 代码层面——方法,陈述
· 模块层面——类和接口
· 库层面——API,Java的库,jar包
· 构建层面——框架(framework)
1.代码层面的复用——最低层次的复用
方法:复制代码
- 维护问题、在运行之中有很高的错误的风险、需要对于软件的运行方式有所理解
· 白盒复用(White box reuse):源代码可见,可修改和扩展。复制已有的代码到正在开发的系统,并做适当的修改。
好处:因为可以修改代码,所以能复用到更多的场合,可定制化程度更好。
缺点:对其修改增加了软件的复杂度,且需要对其内部有充分的了解。
· 黑盒复用(Black box reuse):源代码不可见,不能修改。只能通过API接口来使用,无法修改代码。
好处:简单清晰
缺点:适应性较差
2.模块层面的复用
类是代码复用的原子单元(atomic unit),并不需要源代码,只需要类的路径(classpath)
- 类的文档十分重要(Java API)
- 封装有助于复用
- 更少的代码管理
- 还会存在版本的兼容问题
- 需要将包和类相关联(静态链接)
Java提供了一种类的复用方式——继承(inheritance)
另一种类的复用方式——委派(Delegation)
委派——一个对象依赖另一个对象来实现其某一子功能
e.g. Sorter将其部分功能委派给了Comparator
明智的委派可以增加代码的复用性。委派可以说是一种实现在不同实例之间分享代码和数据低级机制。
3.库层面的复用(API和包)
库(Libraries):一系列提供了复用功能的类和方法
框架(Framework):能在应用之中被定制的可复用的代码
4.系统层面的复用:框架
框架:一组具体类、抽象类、及其之间的连接关系。开发者根据framework的规约,填充自己的代码进去,形成完整系统
四.可复用性的外部观察
类型可变(Type Variation):
可复用元素应当被类型参数化(type-parameterized),因此它们才能适应不同的数据类型。由此可见,应当使用泛型来适应不同的类型,且要满足LSP原则。
实现可变(Implementation Variation)
ADT 有多种不同的实现,提供不同的representations 和abstract funtion ,但具有同样的specification (pre-condition, post-condition, invariants)
功能分组(Routine Grouping):
提供完备的细粒度操作,保证功能的完整性,不同场景下复用不同的操作( 及其组合)
表示独立(Representation Independence):
可复用模块的一般形式是使客户端知道特定的操作但不清楚内部的具体实现。
共性抽取(Factoring Out Common Behaviors):
将共同的行为(共性)抽象出来,形成可复用实体
资料来源: 哈工大软件构造课程