的多声部合唱来特征化。这样,许多体系结构单元都可以通过这些元素中的一些简单的交互 模式来描述 每一个应用论域都可以一个结构模型来特征化。如飞行器电子设备系统虽然在细节上有 很大的不同,但在这个论域中的所有的现行软件都有相同的结构模型。因此,结构模型是一 种能够而且也应该跨越该论域所有应用的可复用的体系结构要素。 结构点是结构模型中的各个不同的构成成分,用于描述系统体系结构中的模式。它有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 概念 面 面描述子 构件 用户界面 窗口 菜单 对话框 事件处理 图形窗口 文本窗口 信息对话框 数据录入对话框 拖放处理 键盘事件处理