1. 软件复用的基本概念
1.1 核心定义
软件复用是指在构造新的软件系统的过程中,对已存在的软件人工制品(Source Code、Design、Architecture等)的使用技术。
助教点拨: 请务必区分以下三个概念(考试易混淆点):
- 软件复用 (Reuse):将已有的成分用于构造新的系统。(跨系统)
- 软件共享 (Sharing):在一个系统中多次使用同一个成分。(系统内)
- 软件移植 (Porting):修改软件使其在新的软硬件平台上运行。(跨平台)
1.2 复用的粒度 (Granularity)
PPT中提到了四种复用级别,从细到粗:
- 源代码复用:
- 特点:只需设置参数,无需介入内部。
- 优缺点:可靠性高,但通用性和抽象性是难点。
- 软件体系结构复用:
- 特点:复用较大粒度的设计结构。
- 优缺点:修改具有局部性,但难以抽象描述,库管理困难。
- 应用程序生成器:
- 特点:自动化程度高,输出特定领域结果。
- 缺点:不易构造。
- 领域特定软件体系结构 (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点):
- 独立性:解决相对独立的问题。
- 完整性:不要留太多缺口让用户补。
- 可标识性:这一点很重要,要能被分类和检索。
- 通用性、适应性、可靠性、标准化。
2.4 构件库的分类模式 (重点)
如何管理成千上万的构件?PPT介绍了三种分类方法:
- 枚举分类 (Enumerated):
- 原理:树状层次结构(如:生物分类法)。
- 例子:窗口类 -> 菜单类 -> 弹出式菜单。
- 刻面分类 (Faceted):
- 原理:定义一组“刻面”(属性维度),如功能、语言、OS。
- 优点:描述最灵活,支持多维度检索。
- 例子:{功能: 绘图, 语言: Java, OS: Windows}。
- 属性-值分类 (Attribute-Value):
- 原理:定义一组属性并赋值。
- 区别:属性数量无限,且无优先级(刻面通常有优先级)。
3. 基于构件的软件开发 (CBSE)
3.1 过程模型
CBSE (Component-Based Software Engineering) 包括两个并发的子过程:
- 领域工程:生产构件(生产者)。
- 基于构件的开发:使用构件(消费者)。
3.2 关键活动步骤 (考试常考流程)
在拿到一个构件后,不能直接用,需要经过以下步骤:
- 构件鉴定 (Qualification):
- 目的:考察构件能否满足需求,可靠性如何。
- 动作:理解构件接口和功能。
- 构件调整 (Adaptation):
- 目的:修改构件以适应特定应用。
- 方法:参数设置、封装(Wrapping)、继承重写。
- 构件组装 (Assembly):
- 目的:将调整后的构件集成到系统中。
- 需求:通常需要胶水代码(Glue Code)或中间件支持。
4. 面向对象与软件复用
这两者是相辅相成的关系:
- OO支持复用:
- 继承 (Inheritance):直接复用父类代码。
- 封装 (Encapsulation):提高构件独立性。
- 多态 (Polymorphism):提高通用性。
- 复用支持OO:
- 提供类库 (Class Libraries)。
- 提供框架 (Frameworks)。
5. 章节总结
本章的核心思想是从“手工作坊”走向“工业化生产”。
- 软件复用是解决软件危机、提高生产率的关键途径,分为代码、设计、架构等不同粒度。
- 领域工程负责“制造”通用的构件资产,而基于构件的开发负责“组装”这些资产。
- 要实现复用,必须要有良好的构件库管理(如刻面分类法)和标准化的构件技术(如CORBA/COM)。