1第八章软件复用一、复习要求1.了解软件复用的概念、过程和意义。2.了解软件复用的类型、复用的目标和内容。3.了解针对复用的过程模型和论域工程。4.了解可复用构件的构造原则和质量标准。5.了解可复用构件库的组织,包括可复用构件的3C模型。6.了解软件的分层式体系结构。7.了解软件构件的复用过程(包括构件的检索与提取、理解与评价和修改)8.了解面向对象的软件复用技术9.了解支持软件复用的CASE工具需求二、内容提要1.软件复用的概念、过程和意义(1)软件复用的概念对建立软件目标系统而言,所谓复用(Reuse),就是利用某些早先开发的对建立新软件系统有用的软件元素来生产新系统。它是一项活动,而不是一个对象。这里所说的软件元素可以包括需求规格说明、设计过程、设计规格说明、程序代码、测试用例、度量等等。对于新的软件开发项目而言,它们或者是构成新软件系统的构件,或者是在软件开发过程中发挥某种作用。通常将这些软件元素称为可复用构件。早在50年代用机器语言编写程序的时期,计算正弦、余弦、对数等的标准子程序包就开创了复用的先河。到70年代的早期,在语言、数据结构、操作系统、程序变换等方面各种技术的发展,都与代码的复用有关。当时,复用的应用领域有限,软件的复用问题没有提到很重要的位置上来讨论。70年代的中期和后期开始,为了缓解软件危机,许多人寄希望于软件复用技术,因为在提高软件生产率与质量,以及减少软件开发时间和成本的努力中软件复用已经成了关键因素。当前,美、日一些大公司的资料表明,软件复用率最高可望达到90%,而且软件复用使得企业在及时满足市场、软件质量、软件开发费用和维护费用等方面得到显著的改进。为了保证软件的复用,需要注意解决的问题主要有:复用必须以对被复用对象的理解为基础;如何表达对软件构件的需求;如何寻找有关的软件构件;如何识别是否满足要求;如何调整或修改构件使之满足要求;如何组装到新系统中;如何保证结果的正确性;如何进行效益的定量估算。只有当复用能带来效益时人们才会考虑复用。2图8.1面向复用的软件开发为了能够在软件开发过程中复用现有的软件构件,必须在此之前不断地进行可复用构件的积累,并且将它们组织成可复用构件库。因此,软件复用不但要讨论如何检索所需的软件构件以及如何对它们进行必要的修剪,而且还要解决如何选取可复用构件、如何组织可复用构件库等问题。(2)软件复用的过程和意义软件复用可以区分为横向复用和纵向复用。横向复用是复用不同应用论域中的软件元素,例如数据结构、排序算法、人机界面构件等。标准函数库是一种典型的原始的横向复用机制。纵向复用是在一类具有较多公共性的应用论域之间复用软件构件。由于在两个截然不同的应用论域之间进行软件复用潜力不大,所以纵向复用受到广泛关注。纵向复用活动的主要关键点在于论域分析:根据应用论域的特征和相似性,预测软件构件的可复用性。一旦根据论域分析确认了软件构件的可复用价值,即可进行软件构件的开发,并对具有可复用价值的软件构件做一般化处理,使它们能够适应新的类似的应用论域。然后将软件构件和它们的文档存入可复用构件库,成为可供未来开发项目使用的可复用资源。这些步骤构成软件构件的构造活动。这是一个不断积累、不断完善软件构件的渐进过程。随着可复用构件的不断丰富,可复用构件库的规模会不断扩大,这样,必须考虑如何组织库的结构以保持较高的检索效率。可供选择的软件构件从库中被检索出来之后,用户还必须理解它的功能或行为,以判定它是否真正适合于当前的应用。必要时,可考虑对某个与期望的功能或行为匹配程度最好的可复用构件进行少量修改,甚至可将修改后的构件再加到可复用构件库中。上述的软件复用的方法如图8.1所示。软件复用的过程可借助计算机的帮助。支持软件复用的CASE工具的主要工作是:用某种组织形式实现可复用构件的存储,提供友好的人机界面,帮助用户浏览、检索和修改可复用构件库,对用户感兴趣的软件构件进行解释。事实上,几乎所有的软件复用活动都是在CASE工具的帮助下进行的。使用复用技术可以减少软件开发活动中大量的重复性工作,这样就能够提高软件生产效率,降低开发成本,缩短开发周期。同时。由于可复用构件大都经过严格的质量验证,并在实际运行环境中得到检验,因此,复用软件构件有助于改善软件质量。此外,大量使用可复用构件,软件的灵活性和标准化程度也可望得到提高。2.软件复用的类型软件复用的范围不仅涉及源程序代码,CaperJones定义了十种可能复用的软件要素:①项目计划:软件项目计划的基本结构和许多内容(如SQA计划)都可以跨项目复用。这样可减少制定计划的时间,也可降低与建立进度表、风险分析及其他特征相关的不确定性。②成本估计:由于不同项目中常包含类似的功能,所以有可能在极少修改或不修改的情况下,复用对该功能的成本估计。③体系结构:即便应用论域千差万别,但程序和数据体系结构大同小异。因此,可以创建一组类属的体系结构模板(例如事务处理结构),将这些模板作为可复用的涉及框架。④需求模型和规格说明:类和对象的模型和规格说明显然可以复用。此外,用传统软论域知识论域分析软件开发与软件构件开发目标软件用户需求理解检索确认可复用构件库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)论域工程论域工程的目的是标识、构造、分类和传播一组软件要素。从软件工程的观点来看,论域就是向应用软件提供应用需求的问题和背景知识。论域工程的主要任务就是针对单个或一族相似的论域,以软件复用为目标,探寻并挖掘论域或论域族中能够为多个应用软件系统共用的软件要素,并对它们进行结构化组织,放入可复用构件库,以备复用。论域工程包括三个主要的活动:分析、构造和传播。4①论域分析过程论域分析与常规的需求分析活动有相似之处,它们都是软件开发中直接基于应用论域的开发活动,并且都要完成程度不同的论域建模任务。但是论域分析必须具有比需求分析更为广阔的视角:不仅要服务于当前的应用,而且要从论域的历史项目中发现这些项目之间的共同点和差异点,并放眼于同类或相似应用论域的未来软件项目。图8.2针对复用的过程模型论域分析的过程如下:定义将要研究的论域;分类从论域中抽取出来的项;收集论域中应用的有代表性的样本;分析样本中的每一个应用;开发对象的分析模型。应当注意的是,论域分析适合于任何一种软件工程范型。Prieto-Diaz扩展了上面论域分析的第2个步骤,建议了一个有8个步骤的标识和分类可复用软件构件的方法:选择特定的功能或对象;抽象功能或对象;定义分类方法;标识公共特征;标识特定的关系;抽象关系;导出功能模型;定义论域语言。论域语言提供了在论域中进行应用的规格说明和构造的手段。下面给出一个检查表,以确定哪些软件要素可以成为可复用的构件。构件的功能在未来的实现工作中需要吗?在论域中构件功能的公共性如何?论域工程论域分析可复用构件库应用软件基于构件的应用开发构件更新测试论域模型分析体系结构设计构件资格构件适应构件合成构件工程结构模型可复用软件构件开发软件体系结构开发5在论域中存在构件功能的副本吗?构件是否依赖于硬件?在不同的实现之间硬件是否保持不变?硬件细节能否移到另一个构件中吗?设计为下一步的实现进行过足够的优化吗?我们能够把一个不可复用的构件参数化以使其成为可复用的构件吗?构件是否可以仅仅经过少量修改就能够在很多实现中复用吗?通过修改实现复用是可行的吗?一个不可复用的构件能否通过分解以产生一组可复用的构件吗?针对复用的构件分解有效到什么程度?②论域特征有时很难确定一个潜在可复用的软件构件在某种特定的情况下是否确实可以使用。为了解决这个难题,有必要定义一组可以为论域中所有软件共享的论域特征。论域特征定义了存在于论域中的所有产品的类属属性。例如,类属属性可能包括有:安全性∕可靠性的重要性、程序设计语言、处理中的并发性,以及其它许多内容。若设某一可复用软件构件p的论域特征的集合为{Dp},集合中每一项Dpi表示某一特定的论域特征。赋予Dpi的值表示该论域特征对软件的相关程度,共分为5个等级:与新软件是否可复用没有相关性。仅在不寻常的情况下相关。相关。此时可以修改软件构件以使其可以被复用。显著相关,且若新软件不具有此特征则复用是低效的。但复用仍有可能。显著相关,且若新软件不具有此特征则复用是无效的。此时不推荐复用。如果想要在某应用论域中构造一个新软件w,可为它导出一组论域特征,然后在Dwi与Dpi之间进行比较,以决定既存的软件构件p是否可以有效地在应用w中复用。表8.2列出典型的对软件复用可能有影响的论域特征,为了有效地复用软件构件,必须考虑这些论域特征。表8.2影响复用的论域特征产品过程人员需求稳定性过程模型动机并发软件过程符合性教育内存限制项目环境经验∕培训应用大小进度限制应用论域用户界面复杂性预算限制过程程序设计语言生产效率平台安全性∕可靠性语言寿命需求开发队伍产品质量生产效率产品可靠性③结构建模和结构点结构建模是一种基于模式的论域工程方法。使用该方法的前提是:每个应用论域有可在应用间重复的模式(功能的、数据的、行为的),它们具有复用的可能。那么,什么是结构建模呢?Pollak和Rissman这样描述:结构模型由数量不多的一些结构元素构成,用这些结构元素可明确地表示交互的模式。使用结构模型的系统体系结构可以通过由这些模型元素组成6的多声部合唱来特征化。这样,许多体系结构单元都可以通过这些元素中的一些简单的交互模式来描述。每一个应用论域都可以一个结构模型来特征化。如飞行器电子设备系统虽然在细节上有很大的不同,但在这个论域中的所有的现行软件都有相同的结构模型。因此,结构模型是一种能够而且也应该跨越该论域所有应用的可复用的体系结构要素。结构点是结构模型中的各个不同的构成成分,用于描述系统体系结构中的模式。它有3