软件工程教案8_第1页
软件工程教案8_第2页
软件工程教案8_第3页
软件工程教案8_第4页
软件工程教案8_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章 软件复用一、复习要求1. 了解软件复用的概念、过程和意义。2. 了解软件复用的类型、复用的目标和内容。3. 了解针对复用的过程模型和论域工程。4. 了解可复用构件的构造原则和质量标准。5. 了解可复用构件库的组织,包括可复用构件的3C模型。6. 了解软件的分层式体系结构。7. 了解软件构件的复用过程(包括构件的检索与提取、理解与评价和修改)8. 了解面向对象的软件复用技术9. 了解支持软件复用的CASE工具需求二、内容提要1. 软件复用的概念、过程和意义(1) 软件复用的概念对建立软件目标系统而言,所谓复用(Reuse),就是利用某些早先开发的对建立新软件系统有用的软件元素来生产新系统。它是一项活动,而不是一个对象。这里所说的软件元素可以包括需求规格说明、设计过程、设计规格说明、程序代码、测试用例、度量等等。对于新的软件开发项目而言,它们或者是构成新软件系统的构件,或者是在软件开发过程中发挥某种作用。通常将这些软件元素称为可复用构件。早在50年代用机器语言编写程序的时期,计算正弦、余弦、对数等的标准子程序包就开创了复用的先河。到70年代的早期,在语言、数据结构、操作系统、程序变换等方面各种技术的发展,都与代码的复用有关。当时,复用的应用领域有限,软件的复用问题没有提到很重要的位置上来讨论。70年代的中期和后期开始,为了缓解软件危机,许多人寄希望于软件复用技术,因为在提高软件生产率与质量,以及减少软件开发时间和成本的努力中软件复用已经成了关键因素。当前,美、日一些大公司的资料表明,软件复用率最高可望达到90%,而且软件复用使得企业在及时满足市场、软件质量、软件开发费用和维护费用等方面得到显著的改进。为了保证软件的复用,需要注意解决的问题主要有: 复用必须以对被复用对象的理解为基础; 如何表达对软件构件的需求; 如何寻找有关的软件构件; 如何识别是否满足要求; 如何调整或修改构件使之满足要求; 如何组装到新系统中; 如何保证结果的正确性; 如何进行效益的定量估算。只有当复用能带来效益时人们才会考虑复用。为了能够在软件开发过程中复用现有的软件构件,必须在此之前不断地进行可复用构件的积累,并且将它们组织成可复用构件库。因此,软件复用不但要讨论如何检索所需的软件构件以及如何对它们进行必要的修剪,而且还要解决如何选取可复用构件、如何组织可复用构件库等问题。(2) 软件复用的过程和意义软件复用可以区分为横向复用和纵向复用。横向复用是复用不同应用论域中的软件元素,例如数据结构、排序算法、人机界面构件等。标准函数库是一种典型的原始的横向复用机制。纵向复用是在一类具有较多公共性的应用论域之间复用软件构件。由于在两个截然不同的应用论域之间进行软件复用潜力不大,所以纵向复用受到广泛关注。纵向复用活动的主要关键点在于论域分析:根据应用论域的特征和相似性,预测软件构件的可复用性。一旦根据论域分析确认了软件构件的可复用价值,即可进行软件构件的开发,并对具有可复用价值的软件构件做一般化处理,使它们能够适应新的类似的应用论域。然后将软件构件和它们的文档存入可复用构件库,成为可供未来开发项目使用的可复用资源。这些步骤构成软件构件的构造活动。这是一个不断积累、不断完善软件构件的渐进过程。论域知识论域分析随着可复用构件的不断丰富,可复用构件库的规模会不断扩大,这样,必须考虑如何组织库的结构以保持较高的检索效率。可供选择的软件构件从库中被检索出来之后,用户还必须理解它的功能或行为,以判定它是否真正适合于当前的应用。必要时,可考虑对某个与期望的功能或行为匹配程度最好的可复用构件进行少量修改,甚至可将修改后的构件再加到可复用构件库中。上述的软件复用的方法如图8.1所示。 软件开发与软件构件开发目标软件用户需求理 解确 认图8.1 面向复用的软件开发软件复用的过程可借助计算机的帮助。支持软件复用的CASE 工具的主要工作是:用某种组织形式实现可复用构件的存储,提供友好的人机界面,帮助用户浏览、检索和修改可复用构件库,对用户感兴趣的软件构件进行解释。事实上,几乎所有的软件复用活动都是在CASE工具的帮助下进行的。检 索可复用构件库使用复用技术可以减少软件开发活动中大量的重复性工作,这样就能够提高软件生产效率,降低开发成本,缩短开发周期。同时。由于可复用构件大都经过严格的质量验证,并在实际运行环境中得到检验,因此,复用软件构件有助于改善软件质量。此外,大量使用可复用构件,软件的灵活性和标准化程度也可望得到提高。2. 软件复用的类型软件复用的范围不仅涉及源程序代码,Caper Jones定义了十种可能复用的软件要素: 项目计划:软件项目计划的基本结构和许多内容(如SQA计划)都可以跨项目复用。这样可减少制定计划的时间,也可降低与建立进度表、风险分析及其他特征相关的不确定性。 成本估计:由于不同项目中常包含类似的功能,所以有可能在极少修改或不修改的情况下,复用对该功能的成本估计。 体系结构:即便应用论域千差万别,但程序和数据体系结构大同小异。因此,可以创建一组类属的体系结构模板(例如事务处理结构),将这些模板作为可复用的涉及框架。 需求模型和规格说明:类和对象的模型和规格说明显然可以复用。此外,用传统软件工程方法开发的分析模型(如数据流图)也可以复用。 设计:用传统方法开发的体系结构、数据、接口和过程化设计都可以复用。另外,复用系统和对象的设计是屡见不鲜的。 源程序代码:验证过的程序构件(用兼容的程序设计语言书写)是可以拿来复用的。 用户文档和技术文档:即便特定的应用不同,但也经常有可能复用用户文档和技术文档中的大部分内容。 用户界面:这可能是最广泛被复用的软件元素。如经常复用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) 论域工程论域工程的目的是标识、构造、分类和传播一组软件要素。从软件工程的观点来看,论域就是向应用软件提供应用需求的问题和背景知识。论域工程的主要任务就是针对单个或一族相似的论域,以软件复用为目标,探寻并挖掘论域或论域族中能够为多个应用软件系统共用的软件要素,并对它们进行结构化组织,放入可复用构件库,以备复用。论域工程包括三个主要的活动:分析、构造和传播。 论域分析过程论域分析与常规的需求分析活动有相似之处,它们都是软件开发中直接基于应用论域的开发活动,并且都要完成程度不同的论域建模任务。但是论域分析必须具有比需求分析更为广阔的视角:不仅要服务于当前的应用,而且要从论域的历史项目中发现这些项目之间的共同点和差异点,并放眼于同类或相似应用论域的未来软件项目。论域工程 结构模型论域模型可复用构件库论域分析软件体系结构开发可复用软件 构件开发应用软件构件合成构件适应体系结构 设计分 析基于构件的 应用开发构件更新构件工程测 试构件资格图 8.2 针对复用的过程模型论域分析的过程如下: 定义将要研究的论域; 分类从论域中抽取出来的项; 收集论域中应用的有代表性的样本; 分析样本中的每一个应用; 开发对象的分析模型。应当注意的是,论域分析适合于任何一种软件工程范型。Prieto-Diaz扩展了上面论域分析的第2个步骤,建议了一个有8个步骤的标识和分类可复用软件构件的方法: 选择特定的功能或对象; 抽象功能或对象; 定义分类方法; 标识公共特征; 标识特定的关系; 抽象关系; 导出功能模型; 定义论域语言。论域语言提供了在论域中进行应用的规格说明和构造的手段。下面给出一个检查表,以确定哪些软件要素可以成为可复用的构件。 构件的功能在未来的实现工作中需要吗? 在论域中构件功能的公共性如何? 在论域中存在构件功能的副本吗? 构件是否依赖于硬件? 在不同的实现之间硬件是否保持不变? 硬件细节能否移到另一个构件中吗? 设计为下一步的实现进行过足够的优化吗? 我们能够把一个不可复用的构件参数化以使其成为可复用的构件吗? 构件是否可以仅仅经过少量修改就能够在很多实现中复用吗? 通过修改实现复用是可行的吗? 一个不可复用的构件能否通过分解以产生一组可复用的构件吗? 针对复用的构件分解有效到什么程度? 论域特征有时很难确定一个潜在可复用的软件构件在某种特定的情况下是否确实可以使用。为了解决这个难题,有必要定义一组可以为论域中所有软件共享的论域特征。论域特征定义了存在于论域中的所有产品的类属属性。例如,类属属性可能包括有:安全性可靠性的重要性、程序设计语言、处理中的并发性,以及其它许多内容。若设某一可复用软件构件p的论域特征的集合为 Dp,集合中每一项Dpi表示某一特定的论域特征。赋予Dpi的值表示该论域特征对软件的相关程度,共分为5个等级: 与新软件是否可复用没有相关性。 仅在不寻常的情况下相关。 相关。此时可以修改软件构件以使其可以被复用。 显著相关,且若新软件不具有此特征则复用是低效的。但复用仍有可能。 显著相关,且若新软件不具有此特征则复用是无效的。此时不推荐复用。如果想要在某应用论域中构造一个新软件w,可为它导出一组论域特征,然后在Dwi与Dpi之间进行比较,以决定既存的软件构件p是否可以有效地在应用w中复用。表8.2列出典型的对软件复用可能有影响的论域特征,为了有效地复用软件构件,必须考虑这些论域特征。表8.2 影响复用的论域特征产 品过 程人 员 需求稳定性 过程模型 动机 并发软件 过程符合性 教育 内存限制 项目环境 经验培训 应用大小 进度限制 应用论域 用户界面复杂性 预算限制 过程 程序设计语言 生产效率 平台 安全性可靠性 语言 寿命需求 开发队伍 产品质量 生产效率 产品可靠性 结构建模和结构点结构建模是一种基于模式的论域工程方法。使用该方法的前提是:每个应用论域有可在应用间重复的模式(功能的、数据的、行为的),它们具有复用的可能。那么,什么是结构建模呢?Pollak和Rissman这样描述:结构模型由数量不多的一些结构元素构成,用这些结构元素可明确地表示交互的模式。使用结构模型的系统体系结构可以通过由这些模型元素组成的多声部合唱来特征化。这样,许多体系结构单元都可以通过这些元素中的一些简单的交互模式来描述。每一个应用论域都可以一个结构模型来特征化。如飞行器电子设备系统虽然在细节上有很大的不同,但在这个论域中的所有的现行软件都有相同的结构模型。因此,结构模型是一种能够而且也应该跨越该论域所有应用的可复用的体系结构要素。结构点是结构模型中的各个不同的构成成分,用于描述系统体系结构中的模式。它有3个特征: 结构点是一个抽象,它应当有有限数量的实例。若用面向对象的术语来陈述,它的类层次的规模应比较小。此外,该抽象应当在论域的各个应用中重复出现,否则,验证、文档化和传播结构点的代价可能是不划算的。 使用结构点的管理规则应是容易理解的,使用结构点的界面应比较简单。 结构点的实现应做到信息隐蔽,将所有在结构点内部包含的复杂性封装(或隔离)在结构点内部。这样,可以减少整个系统的感知复杂性。4. 可复用构件的构造原则和质量标准 论域分析的结果为可复用构件的选取提供了指导原则。一旦确定了某些软件元素应当称为可复用构件并要加入到可复用构件库中,软件人员就必须实际构造它们。由于软件构件的生存期将跨越开发项目,甚至应用论域,因此,可复用构件必须更为通用、更容易组装到新的软件系统中、再新的运行环境下能表现出更好的健壮性。代码极复用时最简单,也是用得最多的。但可复用软件构件不仅包括代码级构件,它还应涵盖论域知识、需求分析文档、设计文档、测试方案、测试用例等。(1) 需求和设计级的软件构件需求级软件构件通常包括问题(及子问题)描述、有关的论域知识、相应的需求规格说明。问题描述及论域知识均使用论域语言,必要时可辅以结构化的自然语言。类似地,设计级软件构件包括设计规格说明(片段)、设计决策描述、相应的设计文档(如总体设计方案、抽象算法)。这时,若能将需求级的软件构件和设计级的软件构件相结合,使需求级软件构件和设计级软件构件的复用同时发生,就能够简化对这些软件构件的理解和组装过程。需求级和设计级软件构件的开发必须遵循以下两条原则: 将构件应用的上下文与构件严格分离; 利用抽象化、参数化等手段提取公共特征,增强构件对未来不同应用项目的适应能力。需求级、设计级与代码级软件构件相结合,有助于代码级软件构件的提取和理解。借助较高抽象级别的软件构件可望提高复用的效能,因为这样不仅能够复用代码,而且能够复用需求模型和设计方案。(2) 代码级的软件构件代码级复用是迄今为止研究最深入、应用最广泛的复用技术。代码级软件构件不仅应包含通常的程序代码段,还应辅以相应的注释和上下文说明。这些辅助可以用结构化语言或其它标识机制描述,但最好以相应的需求级或设计级软件构件的形式出现。传统上,代码级软件构件的主体是子程序(过程或函数)。现在,在基于对象和面向对象程序设计语言及相应的开发环境下,软件构件可以用Ada程序包或C+类来实现。开发代码级软件构件与通常的程序设计活动不同,其主要区别在于:软件人员必须运用各种抽象化手段,以发掘公共特征,分离构件的应用上下文、功能和行为,从而提高可复用性。典型的抽象方法有如下3种。 功能抽象:软件构件的功能由接口说明中的输入关系确定,实现细节对构件的使用者隐藏起来; 数据抽象:在功能抽象的基础上进一步隐藏除接口参数外的所有数据。构件的功能或行为由输入参数和构件自身记忆的内部状态决定。构件的内部状态可由构件的内部操作来更新。面向对象程序设计语言中的“类”是一种典型的基于数据抽象的软件构件。 过程抽象:在数据抽象的基础上进一步实现在同一软件构件上并发执行的多个线程的无关性。软件构件提供端口,以便为多个用户同时访问软件构件中的资源进行同步控制。访问请求首先进入等待队列,软件构件就绪后,从队列中取出请求逐个执行。使用构件的多个线程之间通过全局共享数据或消息传递进行信息交换。软件构件的设计必须保证构件接口元素的功能和行为在语义上的正确性,不管各线程操作序列之间的相对时序如何变化。(3) 程序设计的主要原则可复用性、可理解性、正确性和易组装性是衡量软件构件质量的重要标准。这些标准都与构件开发过程中的程序设计风格密切相关。对于代码级软件构件的开发者,必须注意遵循以下的程序设计原则。 可复用性与易组装性 抽象化、参数化、模板化; 显式建立构件的外部接口,保证接口在语法上和语义上的清晰性; 除参数外,接口中的成分不应与运行环境相关; 使用构件的信息应与构件的实现细节相分离; 构件接口的使用方式、功能和行为模式应遵循论域分析所确立的公共标准。 正确性 使用显式的、标准的、完备的出错处理机制; 使用强类型的程序设计; 在构件上附加重要的测试数据和测试报告。 可理解性 提供完全的、精确的文档和程序注解; 构件内部的结构、数据和控制流程必须标准化; 使用统一的命名规则和语法约定。(4) 软件构件的质量保证由于软件构件将在多种硬件和软件环境下运行,因此,除采用软件工程的一般的质量保证措施之外,还要针对可复用构件的特征进行特别的质量保证。 构件的开发者应当利用现有的硬件、软件,在尽可能多的环境中进行各种标准测试。但是。由于条件的限制及未来运行环境的不可穷举性,这种方法对于构件的质量保证并不充分,必须与其它方法配合使用。 在构件的设计过程中必须预先考虑构件对于各类可能的硬件环境的可移植性和对于不同软件环境的适应能力。根据设计制定相应的编程原则,并在编程的过程中贯彻始终。 应当尽可能将构件的与环境有关的因素抽象成为构件的参数,或者可将这些因素作为使用构件的约束条件在接口说明中详细阐述,甚至可以将这些约束条件标识成精确的逻辑断言插装到构件的源程序中。 对可能引发移植性错误和适应性错误的出错源进行分类,针对每一类出错源制定相应的防范和测试措施。移植性错误包括数值计算错误、多任务调度错误、内存使用错误等;适应性错误包括并发性错误、重名错误、表达式求值顺序错误等。针对每一类出错源制定相应的防范和测试措施与硬件、软件环境密切相关。 制订并执行统一的、良好的程序设计风格。这对于确保构件质量,提高可复用性、可理解性和易组装性有重要的意义。 成立构件质量保证小组。其主要任务是:制订构件合格的标准和构件质量保证计划,对构件开发过程进行监控,保证上述措施的落实。5. 可复用构件库的组织需要对收集和开发的软件构件进行分类,然后把它们放入到可复用构件库的适当为止。软件构件的分类方法和相应的构件库结构对构件的检索和理解有极为深刻的影响,就是说,可复用构件库的组织应当便于构件的存储和检索。复用技术对可复用构件库组织方法的要求是: 支持构件库的各种维护操作。增、删、更新构件库应当尽量不影响构件库的结构; 不仅能够支持精确匹配,还应能支持相似构件的查找; 不仅能够进行简单的语法匹配,而且能够查找在功能和行为上等价或相似的构件; 对应用论域(族)有较强的描述能力和较好的描述精确度; 便于库管理员和用户使用; 具备可自动化的潜力。(1) 枚举分类此方法通过定义一个层次结构类描述构件。在这个层次中定义软件构件的类以及不同层次的子类。真实的构件都被罗列在枚举层次中任一路径的最低层。例如,对窗口操作的枚举层次可能是:window operationsdisplay openmenu-basedopenWindowsystem-basedsysWindowclosevia pointerresizevia commandsetWindowSize, stdResize, shrinkWindowvia dragpullWindow, StretchWindowup/down shufflemove枚举分类模式的层次结构使得它易于理解和使用。但在建立层次之前,必须进行论域工程,这样层次中各个项可以有充足的知识以供使用。(2) 关键词分类此方法的基本思想是:根据论域分析的结果,将应用论域(族)的概念按照从抽象到具体的顺序,逐步分解树形结构或有向无回路图结构。每个概念用一个描述性的关键词表示。不可再分解的原子层的包含隶属于它的某些软件构件。图8.3给出了可复用构件库的关键词分类结构,它支持图形用户界面设计。当加入新的构件时,库管理员必须对构件的功能或行为进行分析,在浏览上述关键词分类结构的同时,将构件置于最合适的原子层关键词之下。如果无法找到构件应从属的关键词,可以扩充现有的关键词分类结构,引进新的关键词。但库管理员必须保证新关键词有相应的论域分析的结果作为支持。对话框事件处理用户界面菜单窗口拖放处理信息对话框图形窗口文本窗口键盘事件处理数据录入对话框图8.3 关键词分类结构示例(3) 多面分类此方法由3部分构成:多面分类机制、同义词库和概念距离图。 多面分类机制:分析论域范围并定义若干用于描述一个构件特征的“面”,每个“面”包含若干“概念”,它们表述构件在“面”上的基本特征。这些特征根据它们的重要性排队。“面”可以描述构件执行的功能、被操作的数据、构件应用的上下文以及任何其它特征。描述某一构件的“面”的集合称为面描述子。通常,限制面的描述不超过7到8个面。作为一个简单的在构件分类中使用“面”的例子,面描述子的模式可以是: 功能,对象类型,系统类型 面描述子中每一个“面”可含有1个或多个特征值,这些值一般是描述性的关键词。例如,若功能(function)是某一构件的一个面,赋与此面的典型值可能是:function = ( copy, from ) or ( copy, replace, all )使用多重面特征值可使原始的函数copy充分地细化。 同义词库:意义相同或相近的若干词汇组成同义词库。所有词汇按照隶属于“面”的“概念”分组,在任一时刻点,每个“概念”可用组内的某一同义词汇作为标识载体。面同义词库F1 F2 FNT11 T21 TN1T12 T22 TN2T13 T23 TN3 T1J T2J TNJdc = ( T1A, T2B, , TNJ )构件面描述子同义词概念距离图T11 S111, S112, , S11kT12 S121, S122, , S12mT13 S131, S132, , S13n 概念距离图:用于度量每个“面”中“概念”的相似性程度。属于每个“面”的一般化概念与其中的两个或多个“概念”以加权边相连接,两个“概念”的相似性由它们之间的最短加权路径上的加权距离确定,附加于边上的权值体现了“概念”之间的差异程度。概念llo T11 o T12 o T13 o T1M 一般化概念 F2F1多面分类机制C图8.4 多面分类法的组成采用多面分类法进行可复用构件库的组织,必须在存储软件构件的同时,表示并存储多面分类机制、同义词库和概念距离图。例如,可以采用关系数据库中的表格来描述它们。多面分类法的所有语法构件(“面”、“概念”、同义词、一般化概念、差异性权值)均取材于论域分析的结果。当需要在可复用构件库中加入新的构件时,库管理源必须对构件的功能、行为进行深入分析,利用现有的多面分类结构确定构件的描述子,对每个“面”选取合适的“概念”作为特征描述。必要时可以考虑增加新的“概念”,此时必须根据新“概念”完善同义词库和概念距离图。(4) 超文本组织法图8.5 超文本结构示意图 l l l l l l l l l l 超文本方法与基于数据库系统的可复用构件库组织方法不同,它基于全文检索技术,其基本思想是:所有软件构件都必须辅以详细的功能或行为说明文档,说明中出现的概念和软件构件以网状链接方式互相连接。检索者在阅读文档的过程中可按照人类的联想思维方式任意跳转到包含相关概念或软件构件的文档中去。全文检索系统将用户给出的关键词与说明文档中的文字进行匹配,实现软件构件的浏览式检索。超文本是一种非线性的网状信息组织方法,它以结点为基本单位,链作为结点之间的联想式关联,如图8.5所示。一般地,结点是一个信息块。对于可复用构件库而言,结点可以是论域的概念、功能或行为名称、构件名称等,在图形用户界面上,结点可以是字符串,也可以是图像、声音、动画等。超文本组织方式为构造可复用构件提供了友好、直观的多媒体方式。由于网状结构比较自由、松散,因此,超文本方法更容易修改可复用构件库的结构。Windows环境下的联机帮助系统就是一种典型的超文本系统。为了构造可复用构件库的文档,首先要根据论域分析的结果,在说明文档中标识超文本结点,并在相关文档中建立链接关系。然后用类似于联机帮助系统编译器的工具对构件的说明文档进行编译,最后用相应的工具运行编译后的目标程序代码即可。(5) 可复用构件的3C模型可以有很多方法来描述可复用的构件,其中最理想的是由Tracz提出的3C模型:概念(Concept)、内容(Content)和上下文(Context)。 概念:描述软件构件做什么。为此,需要完全地描述构件的接口和表示语义(表示在前置条件和后置条件的上下文中)。概念将传达构件的意图。 内容:描述软件构件的概念如何实现。一般来讲,内容是对外来用户隐蔽的信息,是只有试图修改或测试该构件的人才需要了解的信息。 上下文:将可复用的构件安置到它的应用论域中。就是说,上下文将通过定义概念的、操作的和实现的特征,使软件人员能够找到合适的构件以满足应用的需求。为了在实际背景下使用,必须把概念、内容和上下文转换成具体的规格说明模式。关于可复用构件的分类模式,已有不少文章讨论过。所有的方法大致归为3个主要的方面:图书馆和信息科学方法、人工智能方法和超文本系统。目前,绝大多数研究都建议使用图书馆科学方法为软件构件进行分类。图8.6给出了一个使用图书馆科学索引法的分类法。“受控的索引词汇表”限制了所有可用于分类对象(或构件)的术语或语法。“不受控的索引词汇表”则对描述的自然状态不加限制。软件构件的分类模式主要有如下3类:索引词汇表不受控的索引词汇表受控的索引词汇表分类关键词抽取术语的 表单文本不抽取术语的 表单文本描述符枚举具有语法多面主题头部不具有语法词典图8.6 源于图书馆索引方法的分类法 6. 分层式体系结构所谓分层式体系结构,是按层次组织软件的一种软件体系结构,其中每一层软件建立在低一层的软件层上。位于同一层的软件系统或子系统具有同等的通用性,在下一层的软件比在上一层的软件通用性更强。一个层次可视为同等通用档次的一组(子)系统。因此,在分层的体系结构中,最高层是应用层,可包容许多应用系统。次高层是构件层,可包括多个可复用构件库系统,可用于建立应用系统。应用系统建立在构件层之上,而此构件层中的许多构件库系统又是建立在更低层次的构件库系统之上。软件的组织方式通常是指软件的静态分层结构,就像在编译连接时软件各个模块之间的分层依赖关系那样,是一种静态的关系,而不是指软件在运行时的组织和动态结构。一个系统的动态特征时由使用事例、协作、过程和结点模型来定义的。这些动态模型需要与软件的静态分层组织联合起来使用。即使按照上述的原则,人们仍然定义出多种形式的分层式体系结构。层次的数目、层次的名称、层次的内容可随情况而定。图8.7给出一种典型的4层次体系结构。图8.7 一种4层次的分层式体系结构各个应用的各种变体各个应用系统应用软件层各个构件库系统 (针对特定论域、 特定业务)特定业务层不依赖平台的低层构件等中间件层特定的平台软件:操作系统等系统软件层最顶层(即最高层)是应用系统层,此层包含多个应用系统,每个应用系统向系统的用户提供一组使用事例。有的应用系统还可具有不同的版本或若干变体。应用系统可以通过其接口与其它系统操作,还可以通过低层软件提供的服务或对象(如操作系统、特定业务服务)间接地与其它系统交互操作。 次顶层(即次高层)是“特定业务”层。此层应当包括专门针对不同业务类型的一系列构件库系统。这样的构件库系统向用户提供可复用的使用事例和对象构件,用于开发应用系统,支持复用业务。特定业务层的软件建立在中间件之上。中间件层位于次高层下面,它为次顶层的各个构件库系统提供实用软件类,以及不依赖于平台的服务。例如,在异种机型环境下的分布式对象计算等等。此层经常包括:图形用户界面构筑者使用的构件库系统、与数据库管理系统(DBMS)的接口、不依赖平台的操作系统服务、对象请求代理(ORBs)、对象链接和嵌入OLE构件,如电子表格和框图编辑器。这些软件主要提供给应用软件和构件开发人员使用,使得他们能够专注于业务构件和应用系统的构筑。最低层是系统软件层,此层包括计算和网络等基础设施软件,如操作系统、专用的硬件接口软件等。目前出现了一些专用操作系统,其本身就提供了不依赖于平台的服务,因此,在依稀结构的第三层和第四层之间,有时界限会变得模糊不清。例如Java就是这种情况。它是一种语言,故它应该位于系统软件层。但还可以把Java看作是组织分布对象的一个重要部分,通过Java可将对象移到不同的机器上,从而改变客户机服务器系统的应用划分。从另一个角度来看,Java的一个重要部分又属于中间件层,至少位于中间件层的许多软件都是用Java语言编写的。为了确保分层式系统可管理,规定在一个系统内,不能从低层复用高层的构件。一个分层式系统有两维:水平方向是在同层次内的相互引用的多个系统,垂直方向表达了跨层次的静态的依赖关系。7. 软件构件的复用(1) 检索与提取构件可复用构件库的检索方法与库的组织方式密切相关。 基于关键词的检索这种检索方法的基本思想是:系统(CASE工具)在图形用户界面上将可复用构件库的关键词树直观地展示给用户,用户通过在树上的逐级浏览寻找需要的关键词并提取相应的构件。当然,用户也可以直接给出关键词(其中可含有通配符),由系统自动地给出合适的候选构件清单。这种方法的优点是简单,易于实现。 多面检索这种检索方法基于多面分类法。步骤如下: 构造查询:用户提供待查构件在每个“面”上的特征,生成构件描述子。此时,用户可以从可复用构件库已有的“概念”中挑选,也可以将某些特征值置为空。系统在库中检索时将忽略特征值为空的“面”。在构造查询的过程中,可以利用同义词库和概念距离图来帮助用户正确选择特征值。 检索构件:实现多面分类法的CASE工具利用同义词库和概念距离图,在可复用构件库中寻找相同的或相近的构件描述子及相应的构件。 对构件进行排序:按照相似程度对被检索出来的构件进行排序,还可以按照与复用有关的度量信息(如构件的复杂性、可复用性、成功复用的次数等)进行排序。这种方法的优点是易于实现相似构件的查找。 超文本检索这种检索方法的步骤是:用户首先给出一个或若干个关键词,系统在构件的说明文档中做精确的或模糊的语法匹配。匹配成功后,向用户提供相应的构件说明。这些构件说明是含有许多超文本结点的正文。用户在阅读这些正文时可实现多个构件说明文档之间的自由跳转,最终选择合适的构件。为了避免用户在跳转过程中迷失方向,系统可以通过图形用户界面显示浏览历史图,允许将特定画面定义为有名“书签”并可随时跳转到“书签”。此外,还可以帮助用户逆着跳转路径逐步返回。这种方法的优点是用户界面友好。 其它检索方法上述检索方法都是基于语法匹配,要求用户对可复用构件库中的出现的众多词汇有较全面的把握,较精确的理解。理论上,理想的检索方法是语义匹配:可复用构件库的用户以形式化的手段描述所需要的构件的功能或行为的语义,系统通过定理证明或基于知识的推理过程寻找语义上等价的或相近的构件。(2) 理解与评价构件准确地理解构件,对于正确地使用和修改构件,都是至关重要的。考虑到设计信息对于理解构件的必要性和构件库的用户逆向发掘设计信息的困难性,要求构件的开发过程必须遵循公共的软件工程规范,并在构件库的说明文档中全面、准确地说明下列内容: 构件的功能和行为; 相关的论域知识; 可适应性约束条件和例外情况; 可以预见的修改部分和修改方法。但是,如果软件人员希望复用那些原先并非为复用而设计的构件,上述要求不能满足。此时软件人员必须借助CASE工具对待选构件进行分析。这种CASE工具对构件(包括相应的文档)进行扫描,将各类信息存入某种浏览数据库,然后回答构件用户的各种查询,进而帮助理解。例如,对于以C或C+ 源程序形式出现的构件,用户可借助于CASE工具查询标识符(包括变量、常量、宏、函数等)的定义和引用。如果源程序中以结构化注解的形式给出函数的前置条件、后置断言、约束与例外情形、算法描述,用户也可以实现对这些信息的直观浏览。逆向工程是理解构件的另一种重要手段。通过对构件进行分析,结合论域知识,半自动地生成构件的设计信息,然后借助设计信息完成对构件的理解和修改。对软件构件的可复用性进行评价,主要通过收集和分析构件的用户在实际复用构件的过程中所得到的各种反馈信息,按照某种论域模型来完成。这些反馈信息包括:复用成功的次数、对构件的修改工作量、构件的健壮性度量(如出错数量)、性能度量(如执行效率和资源消耗量)等。(3) 修改构件理想的情况是对库中的构件不做修改就可以直接用于新的软件项目。但是,在多数情况下,需要对构件做或多或少的修改以适应新的需求。为了减少修改的工作量,要求构件的开发人员尽量使构件的功能、行为、接口抽象化、通用化、参数化。这样,构件的用户可以通过对实参的选择来调整构件的功能或行为。如果这种调整仍不能使构件适应新的软件项目,用户就必须借助设计信息和说明文档来理解、修改构件。因此,与构件有关的说明文档和抽象层次更高的设计信息对于构件的修改至关重要。例如,如果需要将用C语言编写的构件(源程序代码)改写为其它语言的形式,构件的算法描述就十分必要。有人在软件复用领域中尝试使构件的修改自动化。例如,可以利用不同数据结构(如链表和数组)之间的相似性自动修改构件外部接口中的参数类型。但是,这种自动修改方式还远远不能取代人工修改方式。(4) 构件的合成构件合成是指将可复用构件库中的构件(经适当修改后)相互连接,或将它们与当前软件项目中的软件元素相连接以构成最终的目标系统。构件合成技术大致可分为基于功能的、基于数据的和面向对象的合成技术。下面简单介绍前两种。 基于功能的合成技术基于功能的合成技术采用子程序调用和参数传递的方式将构件结合起来。它要求在库中的构件必须以标准子程序(标准过程或函数)的形式出现,并且接口说明必须准确、清楚。当使用这种合成技术进行软件开发时,必须开发人员必须对目标软件系统进行自顶向下的功能分解,将系统分解为高内聚、低耦合的功能模块,然后根据各模块的功能需求提取构件,对它们进行适应性修改后,再纳入到上述功能分解的层次框架中。 基于数据的合成技术基于数据的合成技术首先根据当前应用问题的核心数据结构设计出一个框架,然后根据框架中各结点的需求提取构件并进行适应性修改,再把它们逐个分配给框架中的适当位置。此后,构件的合成方式仍然是传统的子程序调用与参数传递。这种合成技术也要求库中的构件以子程序的形式出现,但它所依赖的软件设计方法不再是功能分解,而是面向数据结构的设计方法,如Jackson系统开发方法。8. 面向对象的软件复用技术由于封装和继承的特性,面向对象方法比其它软件开发方法更适合支持软件复用。封装意味着可以将表示构件的类看作黑盒子。使用它们时,只需了解其外部接口,即了解它能够响应哪些消息,相应的对象行为是什么。继承是指在定义新的子类时可利用库中已有的父类的属性和操作。当然,子类也可以修改父类的属性与操作,或者引进新的属性与操作。理论上构件的用户不需要了解构件的实现细节。(1) 类库的构造通常将面向对象的可复用构件库称为可复用类库(简称类库),因为这时所有的构件都是以类的形式出现。可复用基类的建立取决于论域分析阶段对当前应用(族)中具有一般适用性的对象和类的标识。类库的组织方式采用类的继承层次结构。这种结构与现实问题空间的实体继承关系有某种自然、直接的对应。同时,类库的文档以超文本方式组织,每个类的说明文档中都可以包含指向其它说明文档的关键词结点的链接指针。与图形用户界面有关的一种典型的类库结构如图8.8所示。CWndCMenuViewsDialog BoxesCobjectFrame WindowsCViewCDialogCMDIFrameWndCCommonDialogCCrtViewCMiniFrameWndCMDIChildWndCPropertyPageCEditViewCFileDialogCListViewCColorDialogCTreeViewCFormViewCScrollView图8.8 类库结构示例(2) 类库的检索一般而言,类库的组织方式直接决定检索方式。常用的类库检索方法是对类库中类的继承层次结构进行树形浏览,以及基于类库文档的超文本检索。借助于树形浏览工具,类库的用户可以从树的根部(继承层次的根类)出发,根据对可复用基类的需求,逐层确定它所属的语法和语义的范畴,然后确定最合适的基类。借助于类库的超文本文档,用户一方面可以在类库的继承层次结构中查阅各基类的属性、操作和其它特征,另一方面可按照基类之间的语义关联实现自由跳转。需要强调的是:对类库的检索并不要求待实现的类与库中的基类完全相同或极为相似,只是希望待实现的类与基类之间存在某种自然的继承关系,或者基类能够提供属性或操作给待实现的子类选用。这与其它可复用构件库的检索截然不同。(3) 类的合成如果从类库中检索出来的基类能够完全满足新软件项目的需求,则可以直接复用。否则必须以类库中的基类为父类,采用构造法或子类法派生出子类。注意,面向对象的复用技术通常不允许用户修改库中的基类,要想对类库进行扩充或修改,应当调整类库的继承结构以把新的子类加入到适当的位置。 构造法:为了在子类中使用库中的基类的属性和操作,可以考虑在子类中引进基类的实例作为作为子类的实例变量,然后在子类中通过实例变量来复用基类的属性或操作。构造法只用到面向对象的封装特征。 子类法:与构造法完全不同,子类法把新子类直接说明为库中基类的子类。通过继承和修改基类的属性和操作来完成新子类的定义。子类法利用了面向对象的封装和继承的特性。9. 支持软件复用的CASE工具能否在软件开发过程中成功地使用复用技术,直接取决于CASE 工具对软件复用的支持程度。下面主要介绍复用技术的各个子任务对于CASE工具的大致需求。当然,这些CASE工具不是软件复用的必要条件,但具备这些工具能提高复用的效能。(1) 论域分析表8.3 论域分析的关键子任务及其支持工具 关 键 子 任 务 支 持 工 具 知识获取 专家系统建造工具 对象及其操作的标识 实体关系图工具 抽象与关联 面向对象的开发工具 对象分类 基于语义的自动分类工具 论域语言处理 语法分析工具(2) 构件的开发表8.4 软件构件开发的关键子任务及其支持工具 关 键 子 任 务 支 持 工 具 提高构件独立性 依赖性分析工具(如交叉引用生成器),软件结构分析器(如调用关系生成器、继承关系生成器) 参数化程序设计语言中的宏替换,编译器中的预处理器,类属机制(如Ada中的Generic) 抽象与特殊化面向对象语言的继承机制 构件的扩充 (增加功能,扩大适用范围)面向对象的语言机制,支持同一软件元素以多个版本不断演化的配置管理工具 测试与认证测试覆盖面分析工具 形式验证定理证明工具 构件质量评估软件质量的度量与分析工具 构件的分类语义近似性分析工具,基于规则的专家系统(3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论