1. 软件复用的基本概念

1.1 核心定义

软件复用是指在构造新的软件系统的过程中,对已存在的软件人工制品(Source Code、Design、Architecture等)的使用技术。

助教点拨: 请务必区分以下三个概念(考试易混淆点):

  • 软件复用 (Reuse):将已有的成分用于构造新的系统。(跨系统)
  • 软件共享 (Sharing):在一个系统中多次使用同一个成分。(系统内)
  • 软件移植 (Porting):修改软件使其在新的软硬件平台上运行。(跨平台)

1.2 复用的粒度 (Granularity)

PPT中提到了四种复用级别,从细到粗:

  1. 源代码复用
    • 特点:只需设置参数,无需介入内部。
    • 优缺点:可靠性高,但通用性和抽象性是难点。
  2. 软件体系结构复用
    • 特点:复用较大粒度的设计结构。
    • 优缺点:修改具有局部性,但难以抽象描述,库管理困难。
  3. 应用程序生成器
    • 特点:自动化程度高,输出特定领域结果。
    • 缺点:不易构造。
  4. 领域特定软件体系结构 (DSSA)
    • 特点复用程度最高,提供通用框架。
    • 缺点:前期投资巨大(High Investment)。

1.3 复用的形式

  • 横向复用 (Horizontal / 水平复用)
    • 定义:跨越不同应用领域。
    • 例子:数据结构、排序算法、GUI按钮。(也就是“万金油”式的组件)
  • 纵向复用 (Vertical / 垂直复用)
    • 定义:限制在同一个应用领域内。
    • 例子:医院挂号模块、银行利息计算模块。(具有行业特征)

1.4 复用的困难

为什么复用这么好,大家却不爱用?

  • 技术因素:构件与新系统不兼容、发现构件难。
  • 人的因素“Not Invented Here” (非我所创) 综合症,程序员更喜欢自己写代码。
  • 管理因素:缺乏激励措施,把复用看作可有可无。

2. 领域工程 (Domain Engineering)

2.1 什么是领域工程?

如果说“软件复用”是“买零件装车”,那么“领域工程”就是“造零件”的过程。

  • 定义:通过领域分析找出最优复用,建立大规模可复用构件仓库的过程。
  • 目标:获得领域需求领域模型

2.2 领域分析的输入与输出

  • 输入:现有应用、技术文件、专家提议、客户需求。
  • 输出:领域模型、需求规约。

2.3 可复用构件 (Reusable Components)

一个软件要想成为“可复用构件”,必须具备“3I”等特性(Independent, Identifiable, Integrated… PPT中列举了7点):

  1. 独立性:解决相对独立的问题。
  2. 完整性:不要留太多缺口让用户补。
  3. 可标识性这一点很重要,要能被分类和检索。
  4. 通用性适应性可靠性标准化

2.4 构件库的分类模式 (重点)

如何管理成千上万的构件?PPT介绍了三种分类方法:

  1. 枚举分类 (Enumerated)
    • 原理:树状层次结构(如:生物分类法)。
    • 例子:窗口类 -> 菜单类 -> 弹出式菜单。
  2. 刻面分类 (Faceted)
    • 原理:定义一组“刻面”(属性维度),如功能、语言、OS。
    • 优点描述最灵活,支持多维度检索。
    • 例子:{功能: 绘图, 语言: Java, OS: Windows}。
  3. 属性-值分类 (Attribute-Value)
    • 原理:定义一组属性并赋值。
    • 区别:属性数量无限,且无优先级(刻面通常有优先级)。

3. 基于构件的软件开发 (CBSE)

3.1 过程模型

CBSE (Component-Based Software Engineering) 包括两个并发的子过程:

  1. 领域工程:生产构件(生产者)。
  2. 基于构件的开发:使用构件(消费者)。

3.2 关键活动步骤 (考试常考流程)

在拿到一个构件后,不能直接用,需要经过以下步骤:

  1. 构件鉴定 (Qualification)
    • 目的:考察构件能否满足需求,可靠性如何。
    • 动作:理解构件接口和功能。
  2. 构件调整 (Adaptation)
    • 目的:修改构件以适应特定应用。
    • 方法:参数设置、封装(Wrapping)、继承重写。
  3. 构件组装 (Assembly)
    • 目的:将调整后的构件集成到系统中。
    • 需求:通常需要胶水代码(Glue Code)或中间件支持。

4. 面向对象与软件复用

这两者是相辅相成的关系:

  • OO支持复用
    • 继承 (Inheritance):直接复用父类代码。
    • 封装 (Encapsulation):提高构件独立性。
    • 多态 (Polymorphism):提高通用性。
  • 复用支持OO
    • 提供类库 (Class Libraries)
    • 提供框架 (Frameworks)

5. 章节总结

本章的核心思想是从“手工作坊”走向“工业化生产”。

  1. 软件复用是解决软件危机、提高生产率的关键途径,分为代码、设计、架构等不同粒度。
  2. 领域工程负责“制造”通用的构件资产,而基于构件的开发负责“组装”这些资产。
  3. 要实现复用,必须要有良好的构件库管理(如刻面分类法)和标准化的构件技术(如CORBA/COM)。