第八章软件复用 复习要求 1.了解软件复用的概念、过程和意义, 2.了解软件复用的类型、复用的目标和内容 3.了解针对复用的过程模型和论域工程。 4.了解可复用构件的构造原则和质量标准 5.了解可复用构件库的组织,包括可复用构件的3C模型 6.了解软件的分层式体系结构 7.了解软件构件的复用过程(包括构件的检索与提取、理解与评价和修改) 8.了解面向对象的软件复用技术 9.了解支持软件复用的CASE工具需求 内容提要 1.软件复用的概念、过程和意义 (1)软件复用的概念 对建立软件目标系统而言,所谓复用( Reuse),就是利用某些早先开发的对建立新软件 系统有用的软件元素来生产新系统。它是一项活动,而不是一个对象。这里所说的软件元素 可以包括需求规格说明、设计过程、设计规格说明、程序代码、测试用例、度量等等。对于 新的软件开发项目而言,它们或者是构成新软件系统的构件,或者是在软件开发过程中发挥 某种作用。通常将这些软件元素称为可复用构件。 早在50年代用机器语言编写程序的时期,计算正弦、余弦、对数等的标准子程序包就 开创了复用的先河。到70年代的早期,在语言、数据结构、操作系统、程序变换等方面各种 技术的发展,都与代码的复用有关。当时,复用的应用领域有限,软件的复用问题没有提到 很重要的位置上来讨论。70年代的中期和后期开始,为了缓解软件危机,许多人寄希望于软 件复用技术,因为在提高软件生产率与质量,以及减少软件开发时间和成本的努力中软件复 用已经成了关键因素。当前,美、日一些大公司的资料表明,软件复用率最高可望达到90% 而且软件复用使得企业在及时满足市场、软件质量、软件开发费用和维护费用等方面得到显 著的改进。 为了保证软件的复用,需要注意解决的问题主要有: 复用必须以对被复用对象的理解为基础; 如何表达对软件构件的需求 如何寻找有关的软件构件 如何识别是否满足要求 如何调整或修改构件使之满足要求 如何组装到新系统中 如何保证结果的正确性 如何进行效益的定量估算。只有当复用能带来效益时人们才会考虑复用
1 第八章 软件复用 一、复习要求 1. 了解软件复用的概念、过程和意义。 2. 了解软件复用的类型、复用的目标和内容。 3. 了解针对复用的过程模型和论域工程。 4. 了解可复用构件的构造原则和质量标准。 5. 了解可复用构件库的组织,包括可复用构件的 3C 模型。 6. 了解软件的分层式体系结构。 7. 了解软件构件的复用过程(包括构件的检索与提取、理解与评价和修改) 8. 了解面向对象的软件复用技术 9. 了解支持软件复用的 CASE 工具需求 二、内容提要 1. 软件复用的概念、过程和意义 (1) 软件复用的概念 对建立软件目标系统而言,所谓复用(Reuse),就是利用某些早先开发的对建立新软件 系统有用的软件元素来生产新系统。它是一项活动,而不是一个对象。这里所说的软件元素 可以包括需求规格说明、设计过程、设计规格说明、程序代码、测试用例、度量等等。对于 新的软件开发项目而言,它们或者是构成新软件系统的构件,或者是在软件开发过程中发挥 某种作用。通常将这些软件元素称为可复用构件。 早在 50 年代用机器语言编写程序的时期,计算正弦、余弦、对数等的标准子程序包就 开创了复用的先河。到 70 年代的早期,在语言、数据结构、操作系统、程序变换等方面各种 技术的发展,都与代码的复用有关。当时,复用的应用领域有限,软件的复用问题没有提到 很重要的位置上来讨论。70 年代的中期和后期开始,为了缓解软件危机,许多人寄希望于软 件复用技术,因为在提高软件生产率与质量,以及减少软件开发时间和成本的努力中软件复 用已经成了关键因素。当前,美、日一些大公司的资料表明,软件复用率最高可望达到 90%, 而且软件复用使得企业在及时满足市场、软件质量、软件开发费用和维护费用等方面得到显 著的改进。 为了保证软件的复用,需要注意解决的问题主要有: ▪ 复用必须以对被复用对象的理解为基础; ▪ 如何表达对软件构件的需求; ▪ 如何寻找有关的软件构件; ▪ 如何识别是否满足要求; ▪ 如何调整或修改构件使之满足要求; ▪ 如何组装到新系统中; ▪ 如何保证结果的正确性; ▪ 如何进行效益的定量估算。只有当复用能带来效益时人们才会考虑复用
为了能够在软件开发过程中复用现有的软件构件,必须在此之前不断地进行可复用构件 的积累,并且将它们组织成可复用构件库。因此,软件复用不但要讨论如何检索所需的软件 构件以及如何对它们进行必要的修剪,而且还要解决如何选取可复用构件、如何组织可复用 构件库等问题 (2)软件复用的过程和意义 软件复用可以区分为横向复用和纵向复用。横向复用是复用不同应用论域中的软件元 素,例如数据结构、排序算法、人机界面构件等。标准函数库是一种典型的原始的横向复用 机制。纵向复用是在一类具有较多公共性的应用论域之间复用软件构件。由于在两个截然不 同的应用论域之间进行软件复用潜力不大,所以纵向复用受到广泛关注 纵向复用活动的主要关键点在于论域分析:根据应用论域的特征和相似性,预测软件构 件的可复用性。一旦根据论域分析确认了软件构件的可复用价值,即可进行软件构件的开发, 并对具有可复用价值的软件构件做一般化处理,使它们能够适应新的类似的应用论域。然后 将软件构件和它们的文档存入可复用构件库,成为可供未来开发项目使用的可复用资源 些步骤构成软件构件的构造活动。这是一个不断积累、不断完善软件构件的渐进过程。 随着可复用构件的不断丰富,可复用构件库的规模会不断扩大,这样,必须考虑如何组 织库的结构以保持较高的检索效率。可供选择的软件构件从库中被检索出来之后,用户还必 须理解它的功能或行为,以判定它是否真正适合于当前的应用。必要时,可考虑对某个与期 望的功能或行为匹配程度最好的可复用构件进行少量修改,甚至可将修改后的构件再加到可 复用构件库中。上述的软件复用的方法如图8.1所示 软件复用的过程可借助计算机的帮助 支持软件复用的CASE工具的主要工作是:论域知识 论域分 用某种组织形式实现可复用构件的存储,提供 友好的人机界面,帮助用户浏览、检索和修改用户需求 软件开发与 目标软件 可复用构件库,对用户感兴趣的软件构件进行 软件构件开发 解释。事实上,几乎所有的软件复用活动都是 在CASE工具的帮助下进行的 使用复用技术可以减少软件开发活动中 大量的重复性工作,这样就能够提高软件生产 效率,降低开发成本,缩短开发周期。同时 由于可复用构件大都经过严格的质量验证,并 在实际运行环境中得到检验,因此,复用软件 可复用构件库 构件有助于改善软件质量。此外,大量使用可 图81面向复用的软件开发 复用构件,软件的灵活性和标准化程度也可望 得到提高。 2.软件复用的类型 软件复用的范围不仅涉及源程序代码, Caper Jones定义了十种可能复用的软件要素: ①项目计划:软件项目计划的基本结构和许多内容(如SQA计划)都可以跨项目复用 这样可减少制定计划的时间,也可降低与建立进度表、风险分析及其他特征相关的不确定性。 ②成本估计:由于不同项目中常包含类似的功能,所以有可能在极少修改或不修改的 情况下,复用对该功能的成本估计 ③体系结构:即便应用论域千差万别,但程序和数据体系结构大同小异。因此,可以 创建一组类属的体系结构模板(例如事务处理结构),将这些模板作为可复用的涉及框架 ④需求模型和规格说明:类和对象的模型和规格说明显然可以复用。此外,用传统软
2 图 8.1 面向复用的软件开发 为了能够在软件开发过程中复用现有的软件构件,必须在此之前不断地进行可复用构件 的积累,并且将它们组织成可复用构件库。因此,软件复用不但要讨论如何检索所需的软件 构件以及如何对它们进行必要的修剪,而且还要解决如何选取可复用构件、如何组织可复用 构件库等问题。 (2) 软件复用的过程和意义 软件复用可以区分为横向复用和纵向复用。横向复用是复用不同应用论域中的软件元 素,例如数据结构、排序算法、人机界面构件等。标准函数库是一种典型的原始的横向复用 机制。纵向复用是在一类具有较多公共性的应用论域之间复用软件构件。由于在两个截然不 同的应用论域之间进行软件复用潜力不大,所以纵向复用受到广泛关注。 纵向复用活动的主要关键点在于论域分析:根据应用论域的特征和相似性,预测软件构 件的可复用性。一旦根据论域分析确认了软件构件的可复用价值,即可进行软件构件的开发, 并对具有可复用价值的软件构件做一般化处理,使它们能够适应新的类似的应用论域。然后 将软件构件和它们的文档存入可复用构件库,成为可供未来开发项目使用的可复用资源。这 些步骤构成软件构件的构造活动。这是一个不断积累、不断完善软件构件的渐进过程。 随着可复用构件的不断丰富,可复用构件库的规模会不断扩大,这样,必须考虑如何组 织库的结构以保持较高的检索效率。可供选择的软件构件从库中被检索出来之后,用户还必 须理解它的功能或行为,以判定它是否真正适合于当前的应用。必要时,可考虑对某个与期 望的功能或行为匹配程度最好的可复用构件进行少量修改,甚至可将修改后的构件再加到可 复用构件库中。上述的软件复用的方法如图 8.1 所示。 软件复用的过程可借助计算机的帮助。 支持软件复用的 CASE 工具的主要工作是: 用某种组织形式实现可复用构件的存储,提供 友好的人机界面,帮助用户浏览、检索和修改 可复用构件库,对用户感兴趣的软件构件进行 解释。事实上,几乎所有的软件复用活动都是 在 CASE 工具的帮助下进行的。 使用复用技术可以减少软件开发活动中 大量的重复性工作,这样就能够提高软件生产 效率,降低开发成本,缩短开发周期。同时。 由于可复用构件大都经过严格的质量验证,并 在实际运行环境中得到检验,因此,复用软件 构件有助于改善软件质量。此外,大量使用可 复用构件,软件的灵活性和标准化程度也可望 得到提高。 2. 软件复用的类型 软件复用的范围不仅涉及源程序代码,Caper Jones 定义了十种可能复用的软件要素: ① 项目计划:软件项目计划的基本结构和许多内容(如 SQA 计划)都可以跨项目复用。 这样可减少制定计划的时间,也可降低与建立进度表、风险分析及其他特征相关的不确定性。 ② 成本估计:由于不同项目中常包含类似的功能,所以有可能在极少修改或不修改的 情况下,复用对该功能的成本估计。 ③ 体系结构:即便应用论域千差万别,但程序和数据体系结构大同小异。因此,可以 创建一组类属的体系结构模板(例如事务处理结构),将这些模板作为可复用的涉及框架。 ④ 需求模型和规格说明:类和对象的模型和规格说明显然可以复用。此外,用传统软 论域知识 论域分析 软件开发与 软件构件开发 用户需求 目标软件 理 解 检 索 确 认 可复用构件库
件工程方法开发的分析模型(如数据流图)也可以复用。 ⑤设计:用传统方法开发的体系结构、数据、接口和过程化设计都可以复用。另外 复用系统和对象的设计是屡见不鲜的。 ⑥源程序代码:验证过的程序构件(用兼容的程序设计语言书写)是可以拿来复用的。 ⑦用户文档和技术文档:即便特定的应用不同,但也经常有可能复用用户文档和技术 文档中的大部分内容。 ⑧用户界面:这可能是最广泛被复用的软件元素。如经常复用GUI的软件构件。因为 它可占到一个应用的60%的代码量,所以复用的效果最明显。 ⑨数据结构:经常被复用的数据结构包括:内部表、列表和记录结构,以及文件和完 整的数据库。 ⑩测试用例:只要将设计或代码构件定义成可复用构件,相关的测试用例就应当成为 这些构件的“从属品”。 表8.1给出的数据(来自军方的一些系统项目)表明1美元投资在4年后的回报。 Jones 对复用的整体影响给出高度评价:“复用所有10种软件要素的总计值可以产生可能是任意已 知的软件技术种的最好回报。” 表81软件复用在4年后的回报价值 可复用软件要素 4年后的回报 可复用软件要素 4年后的回报 源程序代码 成本估计 3.00 用户文档和技术文档 l.50 体系结构 用户界面 求模型和规格说明 3.00 数据结构 s5.00 测试用例 3.50 需要注意的是,复用还可以扩展到以上所讨论的可交付的软件要素之外,它还包含了软 件工程过程中的元素。特定的分析建模方法、检查技术、测试用例设计技术、质量保证过程, 以及很多其它软件工程实践都可以被“复用”。例如,如果某项目组有效地应用了某种软件工 程方法,那么在开发其它项目时可以复用该方法。为帮助潜在的该方法的使用者选择这个方 法,应定义一组功能描述,以帮助人们作出适当的决策。 3.论域工程 (1)针对复用的过程模型 针对复用的过程模型如图8.2所示。这种过程模型强调并行的工作方式。以这种方式, 论域工程和基于构件的应用开发同时进行 论域工程创建应用论域的模型,这个模型将成为软件工程流中分析用户需求的基础。软 件体系结构(及相应的结构点)为应用的设计提供了输入。最后,当可复用构件构造好并放入 可复用构件库中(在论域工程中进行)之后,它们就可以在软件构造活动中供软件开发人员使 用 (2)论域工程 论域工程的目的是标识、构造、分类和传播一组软件要素。从软件工程的观点来看,论 域就是向应用软件提供应用需求的问题和背景知识。论域工程的主要任务就是针对单个或 族相似的论域,以软件复用为目标,探寻并挖掘论域或论域族中能够为多个应用软件系统共 用的软件要素,并对它们进行结构化组织,放入可复用构件库,以备复用。 论域工程包括三个主要的活动:分析、构造和传播
3 件工程方法开发的分析模型(如数据流图)也可以复用。 ⑤ 设计:用传统方法开发的体系结构、数据、接口和过程化设计都可以复用。另外, 复用系统和对象的设计是屡见不鲜的。 ⑥ 源程序代码:验证过的程序构件(用兼容的程序设计语言书写)是可以拿来复用的。 ⑦ 用户文档和技术文档:即便特定的应用不同,但也经常有可能复用用户文档和技术 文档中的大部分内容。 ⑧ 用户界面:这可能是最广泛被复用的软件元素。如经常复用 GUI 的软件构件。因为 它可占到一个应用的 60%的代码量,所以复用的效果最明显。 ⑨ 数据结构:经常被复用的数据结构包括:内部表、列表和记录结构,以及文件和完 整的数据库。 ⑩ 测试用例:只要将设计或代码构件定义成可复用构件,相关的测试用例就应当成为 这些构件的“从属品”。 表 8.1 给出的数据(来自军方的一些系统项目)表明 1 美元投资在 4 年后的回报。Jones 对复用的整体影响给出高度评价:“复用所有 10 种软件要素的总计值可以产生可能是任意已 知的软件技术种的最好回报。” 表 8.1 软件复用在 4 年后的回报价值 可复用软件要素 4 年后的回报 可复用软件要素 4 年后的回报 项目计划 $ 2.00 源程序代码 $ 6.00 成本估计 $ 3.00 用户文档和技术文档 $ 1.50 体系结构 $ 1.50 用户界面 $ 1.00 需求模型和规格说明 $ 3.00 数据结构 $ 3.50 设计 $ 5.00 测试用例 $ 3.50 需要注意的是,复用还可以扩展到以上所讨论的可交付的软件要素之外,它还包含了软 件工程过程中的元素。特定的分析建模方法、检查技术、测试用例设计技术、质量保证过程, 以及很多其它软件工程实践都可以被“复用”。例如,如果某项目组有效地应用了某种软件工 程方法,那么在开发其它项目时可以复用该方法。为帮助潜在的该方法的使用者选择这个方 法,应定义一组功能描述,以帮助人们作出适当的决策。 3. 论域工程 (1) 针对复用的过程模型 针对复用的过程模型如图 8.2 所示。这种过程模型强调并行的工作方式。以这种方式, 论域工程和基于构件的应用开发同时进行。 论域工程创建应用论域的模型,这个模型将成为软件工程流中分析用户需求的基础。软 件体系结构(及相应的结构点)为应用的设计提供了输入。最后,当可复用构件构造好并放入 可复用构件库中(在论域工程中进行)之后,它们就可以在软件构造活动中供软件开发人员使 用。 (2) 论域工程 论域工程的目的是标识、构造、分类和传播一组软件要素。从软件工程的观点来看,论 域就是向应用软件提供应用需求的问题和背景知识。论域工程的主要任务就是针对单个或一 族相似的论域,以软件复用为目标,探寻并挖掘论域或论域族中能够为多个应用软件系统共 用的软件要素,并对它们进行结构化组织,放入可复用构件库,以备复用。 论域工程包括三个主要的活动:分析、构造和传播
①论域分析过程 论域分析与常规的需求分析活动有相似之处,它们都是软件开发中直接基于应用论域的 开发活动,并且都要完成程度不同的论域建模任务。但是论域分析必须具有比需求分析更为 广阔的视角:不仅要服务于当前的应用,而且要从论域的历史项目中发现这些项目之间的共 同点和差异点,并放眼于同类或相似应用论域的未来软件项目。 论域工程 论域分析 软件体系 可复用软件 结构开发 构件开发 论域模型 结构模型 可复用构件库 基于构件的 应用开发 构件资格 1构件更新 构件适应 体系结构 应用软件 析 构件合成 构件工程 图82针对复用的过程模 论域分析的过程如下: 定义将要研究的论域: 分类从论域中抽取出来的项 收集论域中应用的有代表性的样本: 分析样本中的每一个应用: 开发对象的分析模型。 应当注意的是,论域分析适合于任何一种软件工程范型。 Prieto-Daz扩展了上面论域分 析的第2个步骤,建议了一个有8个步骤的标识和分类可复用软件构件的方法 选择特定的功能或对象: 抽象功能或对象 定义分类方法; 标识公共特征 标识特定的关系 抽象关系 导出功能模型 定义论域语言。 论域语言提供了在论域中进行应用的规格说明和构造的手段。下面给出一个检查表,以 确定哪些软件要素可以成为可复用的构件。 构件的功能在未来的实现工作中需要吗? 在论域中构件功能的公共性如何?
4 ① 论域分析过程 论域分析与常规的需求分析活动有相似之处,它们都是软件开发中直接基于应用论域的 开发活动,并且都要完成程度不同的论域建模任务。但是论域分析必须具有比需求分析更为 广阔的视角:不仅要服务于当前的应用,而且要从论域的历史项目中发现这些项目之间的共 同点和差异点,并放眼于同类或相似应用论域的未来软件项目。 图 8.2 针对复用的过程模型 论域分析的过程如下: ▪ 定义将要研究的论域; ▪ 分类从论域中抽取出来的项; ▪ 收集论域中应用的有代表性的样本; ▪ 分析样本中的每一个应用; ▪ 开发对象的分析模型。 应当注意的是,论域分析适合于任何一种软件工程范型。Prieto-Diaz 扩展了上面论域分 析的第 2 个步骤,建议了一个有 8 个步骤的标识和分类可复用软件构件的方法: ▪ 选择特定的功能或对象; ▪ 抽象功能或对象; ▪ 定义分类方法; ▪ 标识公共特征; ▪ 标识特定的关系; ▪ 抽象关系; ▪ 导出功能模型; ▪ 定义论域语言。 论域语言提供了在论域中进行应用的规格说明和构造的手段。下面给出一个检查表,以 确定哪些软件要素可以成为可复用的构件。 ▪ 构件的功能在未来的实现工作中需要吗? ▪ 在论域中构件功能的公共性如何? 论域工程 论域分析 可复用构件库 应用软件 基于构件的 应用开发 构件更新 测 试 论域模型 分 析 体系结构 设计 构件资格 构件适应 构件合成 构件工程 结构模型 可复用软件 构件开发 软件体系 结构开发
在论域中存在构件功能的副本吗? 构件是否依赖于硬件? 在不同的实现之间硬件是否保持不变? 硬件细节能否移到另一个构件中吗? 设计为下一步的实现进行过足够的优化吗? 我们能够把一个不可复用的构件参数化以使其成为可复用的构件吗? 构件是否可以仅仅经过少量修改就能够在很多实现中复用吗? 通过修改实现复用是可行的吗? 个不可复用的构件能否通过分解以产生一组可复用的构件吗? 针对复用的构件分解有效到什么程度? ②论域特征 有时很难确定一个潜在可复用的软件构件在某种特定的情况下是否确实可以使用。为了 解决这个难题,有必要定义一组可以为论域中所有软件共享的论域特征。论域特征定义了存 在于论域中的所有产品的类属属性。例如,类属属性可能包括有:安全性/可靠性的重要性、 程序设计语言、处理中的并发性,以及其它许多内容。 若设某一可复用软件构件p的论域特征的集合为{D},集合中每一项Dpi表示某一特 定的论域特征。赋予Dpi的值表示该论域特征对软件的相关程度,共分为5个等级 与新软件是否可复用没有相关性 仅在不寻常的情况下相关 相关。此时可以修改软件构件以使其可以被复用 显著相关,且若新软件不具有此特征则复用是低效的。但复用仍有可能 显著相关,且若新软件不具有此特征则复用是无效的。此时不推荐复用 如果想要在某应用论域中构造一个新软件w,可为它导出一组论域特征,然后在Dw 与Dpi之间进行比较,以决定既存的软件构件p是否可以有效地在应用w中复用 表82列出典型的对软件复用可能有影响的论域特征,为了有效地复用软件构件,必须 考虑这些论域特征。 表82影响复用的论域特征 需求稳定性 程模型 动机 并发软件 程符合性 教育 内存限制 项目环境 经验/培训 应用大小 进度限制 应用论域 用户界面复杂性 预算限制 过程 程序设计语言 平台 安全性/可靠性 语言 寿命需求 开发队伍 产品质量 生产效率 品可靠性 ③结构建模和结构点 结构建模是一种基于模式的论域工程方法。使用该方法的前提是:每个应用论域有可在 应用间重复的模式(功能的、数据的、行为的),它们具有复用的可能。那么,什么是结构建 模呢? Pollak和 Rissman这样描述:结构模型由数量不多的一些结构元素构成,用这些结构 元素可明确地表示交互的模式。使用结构模型的系统体系结构可以通过由这些模型元素组成
5 ▪ 在论域中存在构件功能的副本吗? ▪ 构件是否依赖于硬件? ▪ 在不同的实现之间硬件是否保持不变? ▪ 硬件细节能否移到另一个构件中吗? ▪ 设计为下一步的实现进行过足够的优化吗? ▪ 我们能够把一个不可复用的构件参数化以使其成为可复用的构件吗? ▪ 构件是否可以仅仅经过少量修改就能够在很多实现中复用吗? ▪ 通过修改实现复用是可行的吗? ▪ 一个不可复用的构件能否通过分解以产生一组可复用的构件吗? ▪ 针对复用的构件分解有效到什么程度? ② 论域特征 有时很难确定一个潜在可复用的软件构件在某种特定的情况下是否确实可以使用。为了 解决这个难题,有必要定义一组可以为论域中所有软件共享的论域特征。论域特征定义了存 在于论域中的所有产品的类属属性。例如,类属属性可能包括有:安全性∕可靠性的重要性、 程序设计语言、处理中的并发性,以及其它许多内容。 若设某一可复用软件构件 p 的论域特征的集合为 {Dp},集合中每一项 Dpi 表示某一特 定的论域特征。赋予 Dpi 的值表示该论域特征对软件的相关程度,共分为 5 个等级: ▪ 与新软件是否可复用没有相关性。 ▪ 仅在不寻常的情况下相关。 ▪ 相关。此时可以修改软件构件以使其可以被复用。 ▪ 显著相关,且若新软件不具有此特征则复用是低效的。但复用仍有可能。 ▪ 显著相关,且若新软件不具有此特征则复用是无效的。此时不推荐复用。 如果想要在某应用论域中构造一个新软件 w,可为它导出一组论域特征,然后在 Dwi 与 Dpi 之间进行比较,以决定既存的软件构件 p 是否可以有效地在应用 w 中复用。 表 8.2 列出典型的对软件复用可能有影响的论域特征,为了有效地复用软件构件,必须 考虑这些论域特征。 表 8.2 影响复用的论域特征 产 品 过 程 人 员 需求稳定性 过程模型 动机 并发软件 过程符合性 教育 内存限制 项目环境 经验∕培训 应用大小 进度限制 ▪ 应用论域 用户界面复杂性 预算限制 ▪ 过程 程序设计语言 生产效率 ▪ 平台 安全性∕可靠性 ▪ 语言 寿命需求 开发队伍 产品质量 生产效率 产品可靠性 ③ 结构建模和结构点 结构建模是一种基于模式的论域工程方法。使用该方法的前提是:每个应用论域有可在 应用间重复的模式(功能的、数据的、行为的),它们具有复用的可能。那么,什么是结构建 模呢?Pollak 和 Rissman 这样描述:结构模型由数量不多的一些结构元素构成,用这些结构 元素可明确地表示交互的模式。使用结构模型的系统体系结构可以通过由这些模型元素组成
的多声部合唱来特征化。这样,许多体系结构单元都可以通过这些元素中的一些简单的交互 模式来描述 每一个应用论域都可以一个结构模型来特征化。如飞行器电子设备系统虽然在细节上有 很大的不同,但在这个论域中的所有的现行软件都有相同的结构模型。因此,结构模型是一 种能够而且也应该跨越该论域所有应用的可复用的体系结构要素。 结构点是结构模型中的各个不同的构成成分,用于描述系统体系结构中的模式。它有3 个特征 结构点是一个抽象,它应当有有限数量的实例。若用面向对象的术语来陈述,它的类 层次的规模应比较小。此外,该抽象应当在论域的各个应用中重复出现,否则,验证、文档 化和传播结构点的代价可能是不划算的。 使用结构点的管理规则应是容易理解的,使用结构点的界面应比较简单 结构点的实现应做到信息隐蔽,将所有在结构点内部包含的复杂性封装(或隔离)在结 构点内部。这样,可以减少整个系统的感知复杂性。 4.可复用构件的构造原则和质量标准 论域分析的结果为可复用构件的选取提供了指导原则。一旦确定了某些软件元素应当称 为可复用构件并要加入到可复用构件库中,软件人员就必须实际构造它们。由于软件构件的 生存期将跨越开发项目,甚至应用论域,因此,可复用构件必须更为通用、更容易组装到新 的软件系统中、再新的运行环境下能表现出更好的健壮性。 代码极复用时最简单,也是用得最多的。但可复用软件构件不仅包括代码级构件,它还 应涵盖论域知识、需求分析文档、设计文档、测试方案、测试用例等。 (1)需求和设计级的软件构件 需求级软件构件通常包括问题(及子问题)描述、有关的论域知识、相应的需求规格说明。 问题描述及论域知识均使用论域语言,必要时可辅以结构化的自然语言 类似地,设计级软件构件包括设计规格说明(片段)、设计决策描述、相应的设计文档(如 总体设计方案、抽象算法)。这时,若能将需求级的软件构件和设计级的软件构件相结合,使 需求级软件构件和设计级软件构件的复用同时发生,就能够简化对这些软件构件的理解和组 装过程。 需求级和设计级软件构件的开发必须遵循以下两条原则 将构件应用的上下文与构件严格分离 利用抽象化、参数化等手段提取公共特征,增强构件对未来不同应用项目的适应能力。 需求级、设计级与代码级软件构件相结合,有助于代码级软件构件的提取和理解。借助 较高抽象级别的软件构件可望提高复用的效能,因为这样不仅能够复用代码,而且能够复用 需求模型和设计方案。 (2)代码级的软件构件 代码级复用是迄今为止研究最深入、应用最广泛的复用技术。代码级软件构件不仅应包 含通常的程序代码段,还应辅以相应的注释和上下文说明。这些辅助可以用结构化语言或其 它标识机制描述,但最好以相应的需求级或设计级软件构件的形式出现。传统上,代码级软 件构件的主体是子程序(过程或函数)。现在,在基于对象和面向对象程序设计语言及相应的 开发环境下,软件构件可以用Ada程序包或C++类来实现。 开发代码级软件构件与通常的程序设计活动不同,其主要区别在于:软件人员必须运用 各种抽象化手段,以发掘公共特征,分离构件的应用上下文、功能和行为,从而提高可复用 性。典型的抽象方法有如下3种。 功能抽象:软件构件的功能由接口说明中的输入一关系确定,实现细节对构件的使用
6 的多声部合唱来特征化。这样,许多体系结构单元都可以通过这些元素中的一些简单的交互 模式来描述。 每一个应用论域都可以一个结构模型来特征化。如飞行器电子设备系统虽然在细节上有 很大的不同,但在这个论域中的所有的现行软件都有相同的结构模型。因此,结构模型是一 种能够而且也应该跨越该论域所有应用的可复用的体系结构要素。 结构点是结构模型中的各个不同的构成成分,用于描述系统体系结构中的模式。它有 3 个特征: ▪ 结构点是一个抽象,它应当有有限数量的实例。若用面向对象的术语来陈述,它的类 层次的规模应比较小。此外,该抽象应当在论域的各个应用中重复出现,否则,验证、文档 化和传播结构点的代价可能是不划算的。 ▪ 使用结构点的管理规则应是容易理解的,使用结构点的界面应比较简单。 ▪ 结构点的实现应做到信息隐蔽,将所有在结构点内部包含的复杂性封装(或隔离)在结 构点内部。这样,可以减少整个系统的感知复杂性。 4. 可复用构件的构造原则和质量标准 论域分析的结果为可复用构件的选取提供了指导原则。一旦确定了某些软件元素应当称 为可复用构件并要加入到可复用构件库中,软件人员就必须实际构造它们。由于软件构件的 生存期将跨越开发项目,甚至应用论域,因此,可复用构件必须更为通用、更容易组装到新 的软件系统中、再新的运行环境下能表现出更好的健壮性。 代码极复用时最简单,也是用得最多的。但可复用软件构件不仅包括代码级构件,它还 应涵盖论域知识、需求分析文档、设计文档、测试方案、测试用例等。 (1) 需求和设计级的软件构件 需求级软件构件通常包括问题(及子问题)描述、有关的论域知识、相应的需求规格说明。 问题描述及论域知识均使用论域语言,必要时可辅以结构化的自然语言。 类似地,设计级软件构件包括设计规格说明(片段)、设计决策描述、相应的设计文档(如 总体设计方案、抽象算法)。这时,若能将需求级的软件构件和设计级的软件构件相结合,使 需求级软件构件和设计级软件构件的复用同时发生,就能够简化对这些软件构件的理解和组 装过程。 需求级和设计级软件构件的开发必须遵循以下两条原则: ▪ 将构件应用的上下文与构件严格分离; ▪ 利用抽象化、参数化等手段提取公共特征,增强构件对未来不同应用项目的适应能力。 需求级、设计级与代码级软件构件相结合,有助于代码级软件构件的提取和理解。借助 较高抽象级别的软件构件可望提高复用的效能,因为这样不仅能够复用代码,而且能够复用 需求模型和设计方案。 (2) 代码级的软件构件 代码级复用是迄今为止研究最深入、应用最广泛的复用技术。代码级软件构件不仅应包 含通常的程序代码段,还应辅以相应的注释和上下文说明。这些辅助可以用结构化语言或其 它标识机制描述,但最好以相应的需求级或设计级软件构件的形式出现。传统上,代码级软 件构件的主体是子程序(过程或函数)。现在,在基于对象和面向对象程序设计语言及相应的 开发环境下,软件构件可以用 Ada 程序包或 C++类来实现。 开发代码级软件构件与通常的程序设计活动不同,其主要区别在于:软件人员必须运用 各种抽象化手段,以发掘公共特征,分离构件的应用上下文、功能和行为,从而提高可复用 性。典型的抽象方法有如下 3 种。 ▪ 功能抽象:软件构件的功能由接口说明中的输入―关系确定,实现细节对构件的使用
者隐藏起来 数据抽象:在功能抽象的基础上进一步隐藏除接口参数外的所有数据。构件的功能或 行为由输入参数和构件自身记忆的内部状态决定。构件的内部状态可由构件的内部操作来更 新。面向对象程序设计语言中的“类”是一种典型的基于数据抽象的软件构件。 过程抽象:在数据抽象的基础上进一步实现在同一软件构件上并发执行的多个线程的 无关性。软件构件提供端口,以便为多个用户同时访问软件构件中的资源进行同步控制。访 问请求首先进入等待队列,软件构件就绪后,从队列中取出请求逐个执行。使用构件的多个 线程之间通过全局共享数据或消息传递进行信息交换。软件构件的设计必须保证构件接口元 素的功能和行为在语义上的正确性,不管各线程操作序列之间的相对时序如何变化 (3)程序设计的主要原则 可复用性、可理解性、正确性和易组装性是衡量软件构件质量的重要标准。这些标准都 与构件开发过程中的程序设计风格密切相关。对于代码级软件构件的开发者,必须注意遵循 以下的程序设计原则 ①可复用性与易组装性 抽象化、参数化、模板化 显式建立构件的外部接口,保证接口在语法上和语义上的清晰性; 除参数外,接口中的成分不应与运行环境相关 使用构件的信息应与构件的实现细节相分离; ■构件接口的使用方式、功能和行为模式应遵循论域分析所确立的公共标准 ②正确性 使用显式的、标准的、完备的出错处理机制; 使用强类型的程序设计 在构件上附加重要的测试数据和测试报告 ③可理解性 提供完全的、精确的文档和程序注解; 构件内部的结构、数据和控制流程必须标准化 使用统一的命名规则和语法约定 (4)软件构件的质量保证 由于软件构件将在多种硬件和软件环境下运行,因此,除采用软件工程的一般的质量保 证措施之外,还要针对可复用构件的特征进行特别的质量保证 ①构件的开发者应当利用现有的硬件、软件,在尽可能多的环境中进行各种标准测试 但是。由于条件的限制及未来运行环境的不可穷举性,这种方法对于构件的质量保证并不充 分,必须与其它方法配合使用 ②在构件的设计过程中必须预先考虑构件对于各类可能的硬件环境的可移植性和对于 不同软件环境的适应能力。根据设计制定相应的编程原则,并在编程的过程中贯彻始终, ③应当尽可能将构件的与环境有关的因素抽象成为构件的参数,或者可将这些因素作 为使用构件的约束条件在接口说明中详细阐述,甚至可以将这些约束条件标识成精确的逻辑 断言插装到构件的源程序中 ④对可能引发移植性错误和适应性错误的出错源进行分类,针对每一类出错源制定相 应的防范和测试措施。移植性错误包括数值计算错误、多任务调度错误、内存使用错误等: 适应性错误包括并发性错误、重名错误、表达式求值顺序错误等。针对每一类出错源制定相 应的防范和测试措施与硬件、软件环境密切相关。 ⑤制订并执行统一的、良好的程序设计风格。这对于确保构件质量,提高可复用性 可理解性和易组装性有重要的意义
7 者隐藏起来; ▪ 数据抽象:在功能抽象的基础上进一步隐藏除接口参数外的所有数据。构件的功能或 行为由输入参数和构件自身记忆的内部状态决定。构件的内部状态可由构件的内部操作来更 新。面向对象程序设计语言中的“类”是一种典型的基于数据抽象的软件构件。 ▪ 过程抽象:在数据抽象的基础上进一步实现在同一软件构件上并发执行的多个线程的 无关性。软件构件提供端口,以便为多个用户同时访问软件构件中的资源进行同步控制。访 问请求首先进入等待队列,软件构件就绪后,从队列中取出请求逐个执行。使用构件的多个 线程之间通过全局共享数据或消息传递进行信息交换。软件构件的设计必须保证构件接口元 素的功能和行为在语义上的正确性,不管各线程操作序列之间的相对时序如何变化。 (3) 程序设计的主要原则 可复用性、可理解性、正确性和易组装性是衡量软件构件质量的重要标准。这些标准都 与构件开发过程中的程序设计风格密切相关。对于代码级软件构件的开发者,必须注意遵循 以下的程序设计原则。 ① 可复用性与易组装性 ▪ 抽象化、参数化、模板化; ▪ 显式建立构件的外部接口,保证接口在语法上和语义上的清晰性; ▪ 除参数外,接口中的成分不应与运行环境相关; ▪ 使用构件的信息应与构件的实现细节相分离; ▪ 构件接口的使用方式、功能和行为模式应遵循论域分析所确立的公共标准。 ② 正确性 ▪ 使用显式的、标准的、完备的出错处理机制; ▪ 使用强类型的程序设计; ▪ 在构件上附加重要的测试数据和测试报告。 ③ 可理解性 ▪ 提供完全的、精确的文档和程序注解; ▪ 构件内部的结构、数据和控制流程必须标准化; ▪ 使用统一的命名规则和语法约定。 (4) 软件构件的质量保证 由于软件构件将在多种硬件和软件环境下运行,因此,除采用软件工程的一般的质量保 证措施之外,还要针对可复用构件的特征进行特别的质量保证。 ① 构件的开发者应当利用现有的硬件、软件,在尽可能多的环境中进行各种标准测试。 但是。由于条件的限制及未来运行环境的不可穷举性,这种方法对于构件的质量保证并不充 分,必须与其它方法配合使用。 ② 在构件的设计过程中必须预先考虑构件对于各类可能的硬件环境的可移植性和对于 不同软件环境的适应能力。根据设计制定相应的编程原则,并在编程的过程中贯彻始终。 ③ 应当尽可能将构件的与环境有关的因素抽象成为构件的参数,或者可将这些因素作 为使用构件的约束条件在接口说明中详细阐述,甚至可以将这些约束条件标识成精确的逻辑 断言插装到构件的源程序中。 ④ 对可能引发移植性错误和适应性错误的出错源进行分类,针对每一类出错源制定相 应的防范和测试措施。移植性错误包括数值计算错误、多任务调度错误、内存使用错误等; 适应性错误包括并发性错误、重名错误、表达式求值顺序错误等。针对每一类出错源制定相 应的防范和测试措施与硬件、软件环境密切相关。 ⑤ 制订并执行统一的、良好的程序设计风格。这对于确保构件质量,提高可复用性、 可理解性和易组装性有重要的意义
⑥成立构件质量保证小组。其主要任务是:制订构件合格的标准和构件质量保证计划 对构件开发过程进行监控,保证上述措施的落实。 5.可复用构件库的组织 需要对收集和开发的软件构件进行分类,然后把它们放入到可复用构件库的适当为止 软件构件的分类方法和相应的构件库结构对构件的检索和理解有极为深刻的影响,就是说 可复用构件库的组织应当便于构件的存储和检索 复用技术对可复用构件库组织方法的要求是 支持构件库的各种维护操作。增、删、更新构件库应当尽量不影响构件库的结构 不仅能够支持精确匹配,还应能支持相似构件的査找 不仅能够进行简单的语法匹配,而且能够查找在功能和行为上等价或相似的构件; 对应用论域(族)有较强的描述能力和较好的描述精确度; 便于库管理员和用户使用 具备可自动化的潜力。 (1)枚举分类 此方法通过定义一个层次结构类描述构件。在这个层次中定义软件构件的类以及不同层 次的子类。真实的构件都被罗列在枚举层次中任一路径的最低层。例如,对窗口操作的枚举 层次可能是: open sys window close via pointer resize setwindow Size. stdResize shrink Window via drag pullwindow, Stretch window up/down shuffle move 枚举分类模式的层次结构使得它易于理解和使用。但在建立层次之前,必须进行论域工 程,这样层次中各个项可以有充足的知识以供使用 (2)关键词分类 此方法的基本思想是:根据论域分析的结果,将应用论域(族)的概念按照从抽象到具体 的顺序,逐步分解树形结构或有向无回路图结构。每个概念用一个描述性的关键词表示。不 可再分解的原子层的包含隶属于它的某些软件构件。图8.3给出了可复用构件库的关键词分 类结构,它支持图形用户界面设计
8 ⑥ 成立构件质量保证小组。其主要任务是:制订构件合格的标准和构件质量保证计划, 对构件开发过程进行监控,保证上述措施的落实。 5. 可复用构件库的组织 需要对收集和开发的软件构件进行分类,然后把它们放入到可复用构件库的适当为止。 软件构件的分类方法和相应的构件库结构对构件的检索和理解有极为深刻的影响,就是说, 可复用构件库的组织应当便于构件的存储和检索。 复用技术对可复用构件库组织方法的要求是: ▪ 支持构件库的各种维护操作。增、删、更新构件库应当尽量不影响构件库的结构; ▪ 不仅能够支持精确匹配,还应能支持相似构件的查找; ▪ 不仅能够进行简单的语法匹配,而且能够查找在功能和行为上等价或相似的构件; ▪ 对应用论域(族)有较强的描述能力和较好的描述精确度; ▪ 便于库管理员和用户使用; ▪ 具备可自动化的潜力。 (1) 枚举分类 此方法通过定义一个层次结构类描述构件。在这个层次中定义软件构件的类以及不同层 次的子类。真实的构件都被罗列在枚举层次中任一路径的最低层。例如,对窗口操作的枚举 层次可能是: window operations display open menu-based openWindow system-based sysWindow close via pointer …… resize via command setWindowSize, stdResize, shrinkWindow via drag pullWindow, StretchWindow up/down shuffle …… move …… 枚举分类模式的层次结构使得它易于理解和使用。但在建立层次之前,必须进行论域工 程,这样层次中各个项可以有充足的知识以供使用。 (2) 关键词分类 此方法的基本思想是:根据论域分析的结果,将应用论域(族)的概念按照从抽象到具体 的顺序,逐步分解树形结构或有向无回路图结构。每个概念用一个描述性的关键词表示。不 可再分解的原子层的包含隶属于它的某些软件构件。图 8.3 给出了可复用构件库的关键词分 类结构,它支持图形用户界面设计
当加入新的构件时,库管理员必须对构件的功能或行为进行分析,在浏览上述关键词分 类结构的同时,将构件置于最合适的原子层关键词之下。如果无法找到构件应从属的关键词 可以扩充现有的关键词分类结构,引进新的关键词。但库管理员必须保证新关键词有相应的 论域分析的结果作为支持。 用户界面 窗口」案单」 对话框 事件处 图形窗口 信息对话框拖放处理 文本窗 数据录入对话框 键盘事件处理 图83关键词分类结构示例 (3)多面分类 此方法由3部分构成:多面分类机制、同义词库和概念距离图。 ①多面分类机制:分析论域范围并定义若干用于描述一个构件特征的“面”,每个“面” 包含若干“概念”,它们表述构件在“面”上的基本特征。这些特征根据它们的重要性排队。 “面”可以描述构件执行的功能、被操作的数据、构件应用的上下文以及任何其它特征。描 述某一构件的“面”的集合称为面描述子。通常,限制面的描述不超过7到8个面 作为一个简单的在构件分类中使用“面”的例子,面描述子的模式可以是: 功能,对象类型,系统类型} 面描述子中每一个“面”可含有1个或多个特征值,这些值一般是描述性的关键词。例 如,若功能( function)是某一构件的一个面,赋与此面的典型值可能是: function=( copy, from )or( copy, replace, all) 使用多重面特征值可使原始的函数copy充分地细化。 ②同义词库:意义相同或相近的若干词汇组成同义词库。所有词汇按照隶属于“面” 的“概念”分组,在任一时刻点,每个“概念”可用组内的某一同义词汇作为标识载体。 ③概念距离图:用于度量每个“面”中“概念”的相似性程度。属于每个“面”的 般化概念与其中的两个或多个“概念”以加权边相连接,两个“概念”的相似性由它们之间 的最短加权路径上的加权距离确定,附加于边上的权值体现了“概念”之间的差异程度 多面分类机制 同义词库 同义词 构件 面描述子 T1+S1,S11,…,S1 T12→S121,S122,…,S12m T3→S131,S132,…,S13n 概念距离图 FN←面 T1T21…TNt←概念 T1 T 船化概念 T1 T2 口T!口T2口T1 口T1
9 当加入新的构件时,库管理员必须对构件的功能或行为进行分析,在浏览上述关键词分 类结构的同时,将构件置于最合适的原子层关键词之下。如果无法找到构件应从属的关键词, 可以扩充现有的关键词分类结构,引进新的关键词。但库管理员必须保证新关键词有相应的 论域分析的结果作为支持。 图 8.3 关键词分类结构示例 (3) 多面分类 此方法由 3 部分构成:多面分类机制、同义词库和概念距离图。 ① 多面分类机制:分析论域范围并定义若干用于描述一个构件特征的“面”,每个“面” 包含若干“概念”,它们表述构件在“面”上的基本特征。这些特征根据它们的重要性排队。 “面”可以描述构件执行的功能、被操作的数据、构件应用的上下文以及任何其它特征。描 述某一构件的“面”的集合称为面描述子。通常,限制面的描述不超过 7 到 8 个面。 作为一个简单的在构件分类中使用“面”的例子,面描述子的模式可以是: { 功能,对象类型,系统类型 } 面描述子中每一个“面”可含有 1 个或多个特征值,这些值一般是描述性的关键词。例 如,若功能(function)是某一构件的一个面,赋与此面的典型值可能是: function = ( copy, from ) or ( copy, replace, all ) 使用多重面特征值可使原始的函数 copy 充分地细化。 ② 同义词库:意义相同或相近的若干词汇组成同义词库。所有词汇按照隶属于“面” 的“概念”分组,在任一时刻点,每个“概念”可用组内的某一同义词汇作为标识载体。 ③ 概念距离图:用于度量每个“面”中“概念”的相似性程度。属于每个“面”的一 般化概念与其中的两个或多个“概念”以加权边相连接,两个“概念”的相似性由它们之间 的最短加权路径上的加权距离确定,附加于边上的权值体现了“概念”之间的差异程度。 多面分类机制 dc = ( T1A, T2B, …, TNJ ) F1 F2 … FN T11 T21 … TN1 T12 T22 … TN2 T13 T23 … TN3 … … … … T1J T2J … TNJ 同义词库 T11 → S111, S112, …, S11k T12 → S121, S122, …, S12m T13 → S131, S132, …, S13n 概念距离图 T11 T12 T13 … T1M 一般化概念 ⚫ ⚫ 同义词 F1 F2 概念 面 面描述子 构件 用户界面 窗口 菜单 对话框 事件处理 图形窗口 文本窗口 信息对话框 数据录入对话框 拖放处理 键盘事件处理
图84多面分类法的组成 采用多面分类法进行可复用构件库的组织,必须在存储软件构件的同时,表示并存储多 面分类机制、同义词库和概念距离图。例如,可以采用关系数据库中的表格来描述它们。多 面分类法的所有语法构件(“面”、“概念”、同义词、一般化概念、差异性权值)均取材于论域 分析的结果。当需要在可复用构件库中加入新的构件时,库管理源必须对构件的功能、行为 进行深入分析,利用现有的多面分类结构确定构件的描述子,对每个“面”选取合适的“概 念”作为特征描述。必要时可以考虑增加新的“概念”,此时必须根据新“概念”完善同义词 库和概念距离图 (4)超文本组织法 超文本方法与基于数据库系统的可复 用构件库组织方法不同,它基于全文检索技 术,其基本思想是:所有软件构件都必须辅 以详细的功能或行为说明文档,说明中出现 的概念和软件构件以网状链接方式互相连 接。检索者在阅读文档的过程中可按照人类 的联想思维方式任意跳转到包含相关概念 图8.5超文本结构示意图 或软件构件的文档中去。全文检索系统将用 户给出的关键词与说明文档中的文字进行匹配,实现软件构件的浏览式检索 超文本是一种非线性的网状信息组织方法,它以结点为基本单位,链作为结点之间的联 想式关联,如图8.5所示。一般地,结点是一个信息块。对于可复用构件库而言,结点可以 是论域的概念、功能或行为名称、构件名称等,在图形用户界面上,结点可以是字符串,也 可以是图像、声音、动画等。超文本组织方式为构造可复用构件提供了友好、直观的多媒体 方式。由于网状结构比较自由、松散,因此,超文本方法更容易修改可复用构件库的结构 Windows环境下的联机帮助系统就是一种典型的超文本系统。为了构造可复用构件库的 文档,首先要根据论域分析的结果,在说明文档中标识超文本结点,并在相关文档中建立链 接关系。然后用类似于联机帮助系统编译器的工具对构件的说明文档进行编译,最后用相应 的工具运行编译后的目标程序代码即可 5)可复用构件的3C模型 可以有很多方法来描述可复用的构件,其中最理想的是由 Tracz提出的3C模型:概念 ( Concept)、内容( Content)和上下文( Context)。 ■概念:描述软件构件做什么。为此,需要完全地描述构件的接口和表示语义(表示在 前置条件和后置条件的上下文中)。概念将传达构件的意图 内容:描述软件构件的概念如何实现。一般来讲,内容是对外来用户隐蔽的信息,是 只有试图修改或测试该构件的人才需要了解的信息。 上下文:将可复用的构件安置到它的应用论域中。就是说,上下文将通过定义概念的 操作的和实现的特征,使软件人员能够找到合适的构件以满足应用的需求。 为了在实际背景下使用,必须把概念、内容和上下文转换成具体的规格说明模式。关于 可复用构件的分类模式,已有不少文章讨论过。所有的方法大致归为3个主要的方面:图书 馆和信息科学方法、人工智能方法和超文本系统。目前,绝大多数研究都建议使用图书馆科 学方法为软件构件进行分类。图86给出了一个使用图书馆科学索引法的分类法。“受控的索 引词汇表”限制了所有可用于分类对象(或构件)的术语或语法。“不受控的索引词汇表”则对 描述的自然状态不加限制。软件构件的分类模式主要有如下3类
10 图 8.5 超文本结构示意图 图 8.4 多面分类法的组成 采用多面分类法进行可复用构件库的组织,必须在存储软件构件的同时,表示并存储多 面分类机制、同义词库和概念距离图。例如,可以采用关系数据库中的表格来描述它们。多 面分类法的所有语法构件(“面”、“概念”、同义词、一般化概念、差异性权值)均取材于论域 分析的结果。当需要在可复用构件库中加入新的构件时,库管理源必须对构件的功能、行为 进行深入分析,利用现有的多面分类结构确定构件的描述子,对每个“面”选取合适的“概 念”作为特征描述。必要时可以考虑增加新的“概念”,此时必须根据新“概念”完善同义词 库和概念距离图。 (4) 超文本组织法 超文本方法与基于数据库系统的可复 用构件库组织方法不同,它基于全文检索技 术,其基本思想是:所有软件构件都必须辅 以详细的功能或行为说明文档,说明中出现 的概念和软件构件以网状链接方式互相连 接。检索者在阅读文档的过程中可按照人类 的联想思维方式任意跳转到包含相关概念 或软件构件的文档中去。全文检索系统将用 户给出的关键词与说明文档中的文字进行匹配,实现软件构件的浏览式检索。 超文本是一种非线性的网状信息组织方法,它以结点为基本单位,链作为结点之间的联 想式关联,如图 8.5 所示。一般地,结点是一个信息块。对于可复用构件库而言,结点可以 是论域的概念、功能或行为名称、构件名称等,在图形用户界面上,结点可以是字符串,也 可以是图像、声音、动画等。超文本组织方式为构造可复用构件提供了友好、直观的多媒体 方式。由于网状结构比较自由、松散,因此,超文本方法更容易修改可复用构件库的结构。 Windows 环境下的联机帮助系统就是一种典型的超文本系统。为了构造可复用构件库的 文档,首先要根据论域分析的结果,在说明文档中标识超文本结点,并在相关文档中建立链 接关系。然后用类似于联机帮助系统编译器的工具对构件的说明文档进行编译,最后用相应 的工具运行编译后的目标程序代码即可。 (5) 可复用构件的 3C 模型 可以有很多方法来描述可复用的构件,其中最理想的是由 Tracz 提出的 3C 模型:概念 (Concept)、内容(Content)和上下文(Context)。 ▪ 概念:描述软件构件做什么。为此,需要完全地描述构件的接口和表示语义(表示在 前置条件和后置条件的上下文中)。概念将传达构件的意图。 ▪ 内容:描述软件构件的概念如何实现。一般来讲,内容是对外来用户隐蔽的信息,是 只有试图修改或测试该构件的人才需要了解的信息。 ▪ 上下文:将可复用的构件安置到它的应用论域中。就是说,上下文将通过定义概念的、 操作的和实现的特征,使软件人员能够找到合适的构件以满足应用的需求。 为了在实际背景下使用,必须把概念、内容和上下文转换成具体的规格说明模式。关于 可复用构件的分类模式,已有不少文章讨论过。所有的方法大致归为 3 个主要的方面:图书 馆和信息科学方法、人工智能方法和超文本系统。目前,绝大多数研究都建议使用图书馆科 学方法为软件构件进行分类。图 8.6 给出了一个使用图书馆科学索引法的分类法。“受控的索 引词汇表”限制了所有可用于分类对象(或构件)的术语或语法。“不受控的索引词汇表”则对 描述的自然状态不加限制。软件构件的分类模式主要有如下 3 类: ▪ ▪ ▪ ⚫ ▪ ▪ ⚫ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ⚫ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ⚫ ▪ ▪ ▪ ⚫ ▪ ▪ ▪ ▪ ▪ ⚫ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ⚫ ▪ ⚫ ▪ ▪ ▪ ▪ ▪ ⚫ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ⚫ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪