5.1 可复用性的度量、形态与外部表现


综述:本节探讨可复用的软件应该“长什么样

1 什么是可复用的软件

  1. 软件重用是使用现有软件组件实现或更新软件系统的过程。
  2. 软件复用的两个维度
    1. programming for reuse 面向复用编程:开发出可复用的软件
    2. programming with reuse 基于复用编程:利用已有的可复用软件搭建应用系统
  3. 软件复用的原因:
    1. 降低成本和开发时间
    2. 经过充分测试,可靠、稳定
    3. 标准化,在不同应用中保持一致
      5.1 可复用性的度量、形态与外部表现
  4. 开发可复用的软件的特点:
    1. 开发成本高于一般软件的成本:要有足够高的适应性
    2. 性能差些:针对更普适场景,缺少足够的针对性
  5. 使用已有软件进行开发
    1. 可复用软件库,对其进行有效的管理
    2. 往往无法拿来就用,需要适配

2. 如何测量可复用性

  1. 可复用性要考虑复用的频率和代价
  2. 一个高复用性的软件应该具备如下特点:
    1. 小、简单
    2. 与标准兼容
    3. 灵活可变
    4. 可扩展
    5. 泛型、参数化
    6. 模块化
    7. 变化的局部性
    8. 稳定
    9. 丰富的文档和帮助

3. 可复用组件的层次和形态

  1. 最主要的复用是在代码层面,但软件构造过程中的任何实体都可能被复用,例如:
    5.1 可复用性的度量、形态与外部表现
  2. 不同可服用的层次:
    1. 代码层次:methods, statements
    2. 模块层次:class and interface
    3. 库层次:API
    4. 建筑学层次:框架
  3. 代码复用的两种类型:
    1. 白盒复用:源代码可见,可修改和扩展。复制已有代码当正在开发的系统,进行修改。优点:可定制化程度高。缺点:对其修改增加了软件的复杂度,且需要对其内部充分的了解。
    2. 黑盒复用:源代码不可见,不能修改。只能通过API接口来使用,无法修改代码。优点:简单,清晰。缺点:适应性差些

3.1 代码复用

  1. 使用上的问题
    1. 需要在多个地方更正代码
    2. 要处理的代码版本太多
  2. 过程中出错的风险很高
  3. 可能需要了解所使用软件的工作原理
  4. 需要访问源代码
  5. 相关研究
    1. 如何从互联网上快速找到需要的代码片段?
    2. 如何从源代码中检测出克隆代码(clone code)?

3.2 模块复用

  1. 复用外部模块时只需要包含在类路径中
  2. 类的复用分为继承和委托两种模式
    1. 继承:需要override父类的方法
    2. 委托:委托可以被描述为在实体之间共享代码和数据的低级机制

3.3 库层面的复用

  1. 库:一组提供可重用功能的类和方法
  2. 框架:可重复使用的框架代码,可以自定义到应用程序中,框架回调客户端代码

3.4 系统层级的复用

  1. 应用框架: 一组具体类、抽象类、及其之间的连接关系。开发者根据
    framework的规约,填充自己的代码进去,形成完整系统。
  2. 将framework看作是更大规模的API复用,除了提供可复用的API,还将这些模块之间的关系都确定下来,形成了整体应用的领域复用
  3. 通过添加组件来填充缺少的设计元素并实例化抽象类来实现系统

4. 可重用性的外部观察

  1. 类型可变:泛型,适应不同的类型,且满足LSP
  2. 实现可变:ADT有多种不同的实现,提供不同的representations和
    abstract funtion,但具有同样的specification (pre-condition, postcondition, invariants),从而可以适应不同的应用场景
  3. 提供完备的细粒度操作,保证功能的完整性,不同场景下复用不同的
    操作(及其组合)
  4. 表示独立性:内部实现可能会经常变化,但客户端不应受到影响。
  5. 考虑常见行为:将共同的行为(共性)抽象出来,形成可复用实体