5.1 可复用性的度量、形态与外部表现
5.1 可复用性的度量、形态与外部表现
综述:本节探讨可复用的软件应该“长什么样”
1 什么是可复用的软件
- 软件重用是使用现有软件组件实现或更新软件系统的过程。
- 软件复用的两个维度
- programming for reuse 面向复用编程:开发出可复用的软件
- programming with reuse 基于复用编程:利用已有的可复用软件搭建应用系统
- 软件复用的原因:
- 降低成本和开发时间
- 经过充分测试,可靠、稳定
- 标准化,在不同应用中保持一致
- 开发可复用的软件的特点:
- 开发成本高于一般软件的成本:要有足够高的适应性
- 性能差些:针对更普适场景,缺少足够的针对性
- 使用已有软件进行开发
- 可复用软件库,对其进行有效的管理
- 往往无法拿来就用,需要适配
2. 如何测量可复用性
- 可复用性要考虑复用的频率和代价
- 一个高复用性的软件应该具备如下特点:
- 小、简单
- 与标准兼容
- 灵活可变
- 可扩展
- 泛型、参数化
- 模块化
- 变化的局部性
- 稳定
- 丰富的文档和帮助
3. 可复用组件的层次和形态
- 最主要的复用是在代码层面,但软件构造过程中的任何实体都可能被复用,例如:
- 不同可服用的层次:
- 代码层次:methods, statements
- 模块层次:class and interface
- 库层次:API
- 建筑学层次:框架
- 代码复用的两种类型:
- 白盒复用:源代码可见,可修改和扩展。复制已有代码当正在开发的系统,进行修改。优点:可定制化程度高。缺点:对其修改增加了软件的复杂度,且需要对其内部充分的了解。
- 黑盒复用:源代码不可见,不能修改。只能通过API接口来使用,无法修改代码。优点:简单,清晰。缺点:适应性差些
3.1 代码复用
- 使用上的问题
- 需要在多个地方更正代码
- 要处理的代码版本太多
- 过程中出错的风险很高
- 可能需要了解所使用软件的工作原理
- 需要访问源代码
- 相关研究
- 如何从互联网上快速找到需要的代码片段?
- 如何从源代码中检测出克隆代码(clone code)?
3.2 模块复用
- 复用外部模块时只需要包含在类路径中
- 类的复用分为继承和委托两种模式
- 继承:需要override父类的方法
- 委托:委托可以被描述为在实体之间共享代码和数据的低级机制
3.3 库层面的复用
- 库:一组提供可重用功能的类和方法
- 框架:可重复使用的框架代码,可以自定义到应用程序中,框架回调客户端代码
3.4 系统层级的复用
- 应用框架: 一组具体类、抽象类、及其之间的连接关系。开发者根据
framework的规约,填充自己的代码进去,形成完整系统。 - 将framework看作是更大规模的API复用,除了提供可复用的API,还将这些模块之间的关系都确定下来,形成了整体应用的领域复用
- 通过添加组件来填充缺少的设计元素并实例化抽象类来实现系统
4. 可重用性的外部观察
- 类型可变:泛型,适应不同的类型,且满足LSP
- 实现可变:ADT有多种不同的实现,提供不同的representations和
abstract funtion,但具有同样的specification (pre-condition, postcondition, invariants),从而可以适应不同的应用场景 - 提供完备的细粒度操作,保证功能的完整性,不同场景下复用不同的
操作(及其组合) - 表示独立性:内部实现可能会经常变化,但客户端不应受到影响。
- 考虑常见行为:将共同的行为(共性)抽象出来,形成可复用实体