1、5 软件维护和软件重用软件维护 软件维护(Software Maintenance)就是在软件产品交付之后对其进行修改,以排除故障,或改进性能和其他属性,或使产品适应改变了的环境。软件维护是软件生存周期中持续时间最长的一个阶段,也是花费精力和费用最多的一个阶段。在软件运行的过程中,维护工作可以占到软件开发全部工作量的一半以上。软件的可维护性是指软件被理解、改正、调整和改进的难易程度,它是指导软件工程各阶段工作的一条基本原则。提高可维护性、减少维护的工作量、降低软件的总成本是软件工程的一个重要任务。软件重用是指在软件开发、维护过程中不作修改或稍加修改就可以重复使用相同或相似的软件元素的过程。软件
2、重用的目的是能更快、更好、成本更低地生产软件。在软件维护时,目前常采用软件重用技术、逆向工程和再工程。本章重点:如何提高软件的可维护性;软件重用。软件维护和软件重用C o n t e n t s目录软件维护01软件重用和再工程0201软件维护软件维护的种类软件维护的特点软件维护过程提高软件的可维护性5.1 软件维护5.1.1 软件维护的种类DABC1)改正性维护 软件测试不大可能找出一个大型软件系统的全部隐含错误。也就是说,几乎每一个大型程序在运行过程中,都会不可避免地出现各种错误。为克服现有软件故障而进行的维护称为改正性维护(Corrective Maintenance)。3)完善性维护 软
3、件交给用户使用后,用户往往会因为工作流程、应用环境的变化,要求增加新的功能和完善性能等。为增加软件功能、增强软件性能、提高软件运行效率而进行的维护称为完善性维护(Perfective Maintenance)。2)适应性维护 计算机技术的发展十分迅速,计算机的软件、硬件环境也在不断发生变化,而应用软件的使用寿命往往比原先开发时的系统环境更为长久,因此,常常需对软件加以修改使之适应改变了的环境。为使软件产品适应环境的变化而进行的软件维护称为适应性维护(Adaptive Maintenance)。4)预防性维护 为了进一步提高软件的可维护性和可靠性,为改进软件性能创造条件,需要对软 件 进 行 的
4、 其 他 维 护 称 为 预 防 性 维 护(Preventive Maintenance)。5.1 软件维护5.1.1 软件维护的种类图5-1 各类维护工作量占总的维护工作量的百分比5.1 软件维护5.1.2 软件维护的特点1)结构化维护与非结构化维护差别巨大 与非结构化维护相比,结构化维护能减少工作量并提高维护的总体质量。这是在软件开发的早期就运用软件工程方法论的结果。012)维护的问题很多02033)维护的代价高昂5.1.2 软件维护的特点图5-2描绘了因软件维护要求而引起的可能的事件流程。图 5-2 图5-2右侧的流程表示的是“非结构化维护”。在这种情况下,由于所掌握的软件文件只有源程
5、序,维护工作只能从分析源程序开始。源程序内部的注解和说明一般来讲不会很详尽,而软件结构、全程数据结构、系统接口、性能和设计约束等细微的特征往往很难完全搞清。在没有软件文档的情况下,维护工作往往要进行这种非结构化维护,并为此而付出代价。这种代价是由于没有使用良好的软件开发方法所造成的。5.1.2 软件维护的特点5.1.2 软件维护的特点图5-2描绘了因软件维护要求而引起的可能的事件流程。图 5-2 图5-2左侧的流程表示的是“结构化维护”。在这种情况下,由于有完整的软件文档,软件维护工作就可从分析软件文档开始,进而确定软件的结构特性、功能特性和接口特性,确定所要求的修改将会带来的影响并计划实施方
6、法。然后修改设计、编写相应的源程序代码、对所做的修改进行复查,并利用在测试说明书中包含的信息重复过去的测试,以确保没有因修改而把错误引入到先前运行的软件中。最后,把修改后的软件再次交付使用。结构化维护能减少工作量并提高维护的总体质量。5.1.2 软件维护的特点5.1.2 软件维护的特点5.1.2 软件维护的特点412345由于可用的资源必须供软件维护任务使用,导致耽误甚至丧失开发良机。有关改错或修改的要求不能及时满足,引起用户不满。在所维护的软件中,由于修改软件而引入潜伏的新的错误,导致软件质量下降。当必须把从事开发的软件人员调去从事维护工作时,将可能打乱软件开发过程。每条指令的维护成本数十倍
7、于每条指令的开发成本,造成生产率的大幅下降。32维护的代价高昂5.1.2 软件维护的特点5.1.2 软件维护的特点01 软件人员经常流动,因而当需要维护时,往往无法依赖开发者本人来对软件进行解释和说明。03 需要维护的软件往往没有足够的、合格的文档。维护时仅有文档是不够的,容易理解的并且和程序代码完全一致的文档,才对维护真正有价值。02 理解他人编写的程序往往是非常困难的,而且软件文档越少,维护难度越大。如果只有程序代码而没有说明文档,则将出现严重困难。03 由于维护工作十分困难,又容易受挫,因而难以成为一项吸引人的工作。3维护的问题很多5.1 软件维护5.1.3 软件维护过程软件维护过程实际
8、上也是软件问题定义和开发的过程。维护活动和软件开发一样,要有严格的规范,才能保证质量。软件开发机构应建立维护组织,当用户需要软件维护时,应填写维护申请表,维护组织对此进行评价,安排维护活动,软件人员的维护过程要详细记录,并填写维护报告,最后要复审。软件维护时,首先要确定维护属于哪种类型。如果属于改正性维护,则需要评价其出错的严重性。如果错误严重,就进一步指定人员,在系统管理员的指导配合下,分析错误的原因,进行维护。对于不太严重的错误,则该项改正性维护和其他软件开发的任务一起统筹安排。如果属于完善性或适应性维护,则先确定各个维护要求的优先次序,并且安排所需工作时间。从其意图和目标来看,属于开发工
9、作,因此可将其视为开发任务。如果某项维护要求的优先次序特别高,可立即开始维护工作。5.1 软件维护5.1.3 软件维护过程不管是改正性、完善性还是适应性维护,都需要进行同样的技术工作,包括修改软件设计、对源程序进行修改、单元测试、组装、有效性测试及复审等。参加软件维护工作的人员并不是越多越好。一般情况下,对需要维护的软件比较熟悉的人员,其维护工作的效率比较高。维护人员在维护过程中要做好详细的记录。对于不同类型的维护,其工作的侧重点会有所不同,但总的处理方法基本上是相同的。5.1 软件维护维护组织维护组织软件开发机构应当建立正式的维护组织,或设立专门负责维护工作的非正式组织。维护组织由维护管理员
10、、系统管理员、维护人员组成。系统管理员必须对软件产品程序或将被修改的那类程序相当熟悉。每当软件开发机构收到用户的维护申请后,交给负责此事的维护管理员,由他把维护申请交给系统管理员评价,再由维护人员决定如何进行修改。015.1.3 软件维护过程5.1 软件维护5.1.3 软件维护过程维护文件维护文件软件维护要有书面文件:用户填写维护申请表、维护管理员填写维护报告、维护人员填写维护记录。1)维护申请表软件开发机构的维护组织向用户提供空白的维护申请表,由要求维护的用户填写,该表应能完整描述软件产生错误的情况(包括输入数据、输出数据及其他有关信息)。对于适应性或完善性的维护要求,则应提出简单明了的维护
11、要求规格说明。维护申请表由维护管理员和系统管理员负责研究处理。022)维护报告软件开发组织在收到用户的维护要求表后,维护管理员应写一份软件维护报告。该报告应包含下述内容:按照要求进行维护所需要的工作量;维护要求的性质;该项要求与其他维护要求相比的优先程度;预计软件维护后的状况。5.1 软件维护5.1.3 软件维护过程维护文件维护文件02 修改程序所增加的源语行数、所删除的源语行数;各次修改耗费的人时数、累计用于维护的人时数;软件工程师的姓名;维护要求表的标识;维护开始和结束的日期;维护工作的净收益。3)维护记录维护记录可以包括如下内容:程序名称;维护类型;所用的编程语言;程序行数或机器指令条数
12、;程序开始使用的日期;已运行次数、故障处理次数;程序改变的级别及名称;5.1 软件维护5.1.3 软件维护过程维护工作流程维护工作流程维护工作流程如下:(1)用户提出维护申请。(2)维护组织审查申请报告并安排维护工作。(3)进行维护并做详细的维护记录。(4)复审。035.1 软件维护5.1.3 软件维护过程维护工作流程维护工作流程当然,有时维护申请的处理过程并不完全符合上述事件流。例如,当出现紧急软件问题时,就出现所谓“救火”维护要求。在这种情况下,就需要立即投入人力进行维护。软件维护的复审要明确下列问题:在目前的状况下,设计、编程、测试等方面有什么可改进的。哪些维护资源应该有,实际上却没有。
13、什么是这项维护工作中最主要的障碍。是否需要预防性维护。维护情况复查对将来的维护工作有重要意义,可为提高软件组织的管理效能提供重要意见。035.1 软件维护5.1.3 软件维护过程对维护的评价对维护的评价在维护过程中,如果缺乏详尽可靠的数据,要评价软件维护工作就很困难。如果有良好的维护记录,就可对维护工作做一些定量的评价,可计算如下一些指标:(1)每次程序运行的平均出错次数。(2)用在各类维护上的总的人时数。(3)平均每个程序、每种语言、每种类型的维护所做的程序变动数。(4)维护过程中每增加或减少一个源语句所平均花费的人时数。(5)维护每种语言所平均花费的人时数。(6)处理一张维护要求表平均所需
14、时间。(7)各类维护申请的百分比。045.1 软件维护5.1.3 软件维护过程软件维护的副作用软件维护的副作用维护是为了延长软件的寿命,让软件创造更多的价值。但是维护会产生潜在的错误或其他不希望出现的情况,称为维护的副作用。维护的副作用有编码副作用、数据副作用和文档副作用3种。055.1 软件维护5.1.3 软件维护过程软件维护副作用数据副作用 修改数据结构时可能造成软件设计与数据结构不匹配,从而导致软件错误。例如,修改局部量、全局量、记录或文件的格式、初始化控制或指针、输入/输出或子程序的参数等容易导致设计与数据不一致。编码副作用 使用程序设计语言修改源程序时可能引入错误。例如,修改程序的标
15、号、标识符、运算符、边界条件、程序的时序关系等,要特别仔细、避免引入新的错误。文档副作用 对数据流、软件结构、模块逻辑或任何其他特性进行修改时,必须对相关的文档进行相应修改,否则可能会导致文档与程序功能不匹配、文档不能反映软件当前的状态。因此,必须在软件交付之前对软件配置进行评审,以减少文档的副作用。5.1 软件维护5.1.4 提高软件的可维护性软件可维护性是指软件功能被理解、改正、适应和增强的难易程度,是维护人员对软件进行维护的难易程度。可维护性是指导软件工程各阶段的一条基本原则,提高可维护性是软件工程追求的目标之一5.1 软件维护5.1.4 提高软件的可维护性可维护性(1)是否拥有一组训练
16、有素的软件人员;(3)文档结构是否标准化;(5)是否已有嵌入系统的调试工具;(7)是否使用了标准的操作系统。(4)测试用例是否合适;(2)系统结构是否可理解、是否合理;(6)是否使用了合适的程序设计语言;造成软件维护工作变得困难的原因是多方面的,有维护人员素质方面的因素,也有技术条件和管理方面的因素等。与开发环境有关的可维护性影响因素如下:1决定软件可维护性的因素5.1 软件维护5.1.4 提高软件的可维护性以上影响软件可维护性的因素中,结构合理性是软件设计时应当考虑的。系统结构若不合理,对其维护当然困难较大。所谓结构的合理性主要是以下列几点为基础的:模块化、层次组织、系统文档的结构、命令的格
17、式和约定、程序的复杂性等。其他影响软件可维护性的因素还有应用的类型、使用的数据库技术、开关与标号的数量、IF语句的嵌套层次、索引或下标变量的数量等。此外软件开发人员是否能参加维护也是值得考虑的因素。5.1 软件维护5.1.4 提高软件的可维护性135 5纠错或修改软件的时间;6 6测试软件的时间;7 7维护评审的时间;8 8软件恢复运行的时间。1 1识别问题的时间;2 2修改规格说明书的时间;3 3分析、诊断问题的时间;4 4选择维护工具的时间;软件的可维护性是难以量化的概念,然而借助维护活动中可以定量估算的属性,可以从下列维护工作所需的时间间接地度量可维护性。2软件可维护性的度量5.1 软件
18、维护5.1.4 提高软件的可维护性 软件的可维护性,主要表现在它的可理解性、可测试性、可修改性、可移植性等方面。因而,对可维护性的度量问题,也可分解成对可理解性、可测试性、可修改性、可移植性的度量问题。软件的可理解性表现为维护人员理解软件结构、接口、功能和内部过程的难易程度。模块化;结构化设计或面向对象设计;与源程序一致的、完整正确详尽的设计文档、源代码内部的文档和良好的高级程序设计语言等,都能提高软件的可理解性。也可以通过对软件复杂性的度量来评价软件的可理解性。软件越复杂,理解就越困难。具体可参考本书第4.5.5节“程序环形复杂程度的度量”。1)可理解性5.1 软件维护5.1.4 提高软件的
19、可维护性 可测试性代表了软件容易被测试的程度。它与源代码有关,要求程序易于理解,还要求有齐全的测试文档,保留开发时期使用的测试用例。好的文档资料对诊断和测试至关重要。可测试性要求软件需求的定义要便于对需求进行分析并易于建立测试准则;还要便于就这些准则对软件进行评价。可测试性是指证实程序正确性的难易程度。此外,有无可用的测试、调试工具及测试过程的确定也非常重要。在软件设计阶段就应该注意使差错容易定位,以便维护时容易找到纠错的办法。2)可测试性5.1 软件维护5.1.4 提高软件的可维护性3)可修改性 可修改性是指程序容易修改的程度。一个可修改的程序往往是可理解的、通用的、灵活的和简明的。所谓通用
20、,是指不需要修改程序就可使程序改变功能。所谓灵活,是指程序容易被分解和组合。要度量一个程序的可修改性,可以通过对该程序做少量简单的改变来估算修改这个程序的困难程度,例如对程序增加新类型的作业、改变输入/输出设备、取消输出报告等。如果对于一个简单的改变,程序中必须修改的模块超过30%,则该程序属于难修改之列。模块设计的内聚、耦合、局部化等因素都会影响软件的可修改性。模块抽象和信息隐蔽愈好,模块的独立性愈高,则修改时出错的机会也就愈少。5.1 软件维护5.1.4 提高软件的可维护性 可移植性是指软件不加改动地从一种运行环境转移到另一种运行环境下运行的能力,即程序在不同计算机环境下能够有效地运行的程
21、度。可移植性好的软件容易维护。4)可移植性5.1 软件维护5.1.4 提高软件的可维护性1明确软件的质量目标 在软件开发的整个过程中,始终应该考虑并努力提高软件的可维护性,尽力将软件设计成容易理解、容易测试和容易修改的软件。2利用先进的软件技术和工具 软件工程在不断发展,新的技术和工具在不断出现,对软件工程的新技术和新工具,应及时学习并应用。3选择便于维护的程序设计语言 机器语言、汇编语言不易理解,难以维护。一般只有在对软件的运行时间和使用空间有严格限制或系统硬件有特殊要求时,才使用机器语言或汇编语言。高级语言容易理解,可维护性较好。查询语言、报表生成语言、图像语言更容易理解、使用和维护。选择
22、适当的程序设计语言非常重要,要慎重、综合地考虑各种因素,征求用户的意见。要提高软件的可维护性,应从以下几个方面入手。5.1 软件维护5.1.4 提高软件的可维护性4采取有效的质量保证措施 在软件开发时需要确定中间及最终交付的成果以及所有开发阶段各项工作的质量特征和评价标准。在每个阶段结束前的技术审查和管理复审中,也应着重对可维护性进行复审。加强软件测试工作,保证软件的质量。用户要求确保软件质量,如果做不到这一点,软件开发人员就无法生存。本书第10.6节将进一步介绍软件质量保证知识。5完善程序的文档软件文档应满足下述要求:(1)描述如何使用系统,没有这种描述,系统将无法使用。(2)描述怎样安装和
23、管理系统。(3)描述系统需求和设计。(4)描述系统的实现和测试。在软件工程生存周期每个阶段的技术复审和管理复审中,应对文档进行检查,对可维护性进行复审。在维护阶段,利用历史文档可大大简化维护工作。历史文档有3种:系统开发文档、错误记录和系统维护文档。02软件重用和再工程软件的重用软件重用过程模型开发可重用的软件构件软件逆向工程软件再工程5.2 软件重用和再工程软件重用(Software Reuse)是指在软件开发、维护过程中不作修改或稍加修改就可以重复使用相同或相似的软件元素的过程。这些软件元素包括应用领域知识、开发经验、设计经验、体系结构、需求分析文档、设计文档、程序代码和测试用例等。对于新
24、的软件开发项目而言,它们是构成整个软件系统的部件,或者在软件开发过程中可发挥某种作用。通常把这些软件元素称为软件构件。5.2 软件重用和再工程逆向工程(Reverse Engineer)是指根据已有的源代码构造软件中间产品,包括重新创建设计和规约。再工程(Reengineering)是指在逆向工程所获得信息的基础上,重新进行软件设计,重构已有系统的一个新版本。在软件开发、维护中采用重用软件构件,一般可以比从头开发这个软件更加容易。软件重用的目的是能更快、更好、成本更低地生产软件制品。各种软件开发过程都能使用重用软件构件,利用面向对象技术,可以方便有效地实现软件重用。5.2 软件重用和再工程5.
25、2.1 软件的重用软件重用知识重用1 1 知识重用是多方面的,例如,软件工程知识,开发经验、设计经验、应用领域知识等的重用。5.2 软件重用和再工程5.2.1 软件的重用软件重用方法和标准重用2 2 方法和标准的重用包括传统软件工程方法、面向对象方法、有关软件开发的国家标准和国际标准的重用等。5.2 软件重用和再工程5.2.1 软件的重用软件重用软件成分的重用3 3 软件成分的重用可分为3个级别:源代码重用、设计结果重用和规格说明重用。5.2 软件重用和再工程5.2.1 软件的重用源代码的剪贴:这种重用存在配置管理问题,无法跟踪代码块的修改重用过程。源代码包含(Include):许多程序设计语
26、言都提供Include机制,所包含的程序库要经过重新编译,才能运行。继承:利用继承机制重用类库中的类时,不必修改已有代码,就可以扩充类,或找到需要的类。源代码重用011可重用的软件成分5.2 软件重用和再工程5.2.1 软件的重用设计结果的重用包括体系结构的重用。设计结果的重用有助于把应用软件系统移植到不同的软件或硬件平台上。设计结果重用021可重用的软件成分5.2 软件重用和再工程5.2.1 软件的重用规格说明重用特别适用于用户需求没有改变,但是系统体系结构发生了变化的场合。规格说明重用031可重用的软件成分5.2 软件重用和再工程5.2.1 软件的重用项目计划项目计划 软件项目计划的基本结
27、构和许多内容是可以重用的。这样,可以减少制订计划的时间,降低建立进度表和进行风险分析等活动的不确定性。软件结构软件结构 在很多情况下,软件结构有相似或相同之处。可以创建一组软件结构模板,作为重用的设计框架。成本估计成本估计 不同的项目中经常含有类似的功能,在做成本估计时,重用部分的成本也可重用。2可重用软件成分的具体内容5.2 软件重用和再工程5.2.1 软件的重用需求模型和规格说明需求模型和规格说明 类和对象的模型及规格说明、数据流图等可以重用。源代码源代码 经过验证的程序构件可以重用。设计设计 系统和对象设计可以重用,用传统方法开发的软件结构、接口、设计过程等可以重用。2可重用软件成分的具
28、体内容5.2 软件重用和再工程5.2.1 软件的重用用户文档和技术文档用户文档和技术文档 经常可以重用这些文档的较大部分内容。数据重用数据重用 包括数据结构的重用、输入数据的重用和中间结果的重用等。用户界面用户界面 很多情况下用户界面可以重用。测试用例测试用例 一旦设计或代码构件被重用,相关的测试用例也应该被重用。2可重用软件成分的具体内容5.2 软件重用和再工程5.2.2 软件重用的过程模型软件重用的组装模型01最简单的软件重用过程是,先将以往软件工程项目中建立的软件构件存储在构件库中;通过对软件构件库进行查询,提取可以重用的构件,为了适应新系统,对它们做一些修改,并建造新系统需要的其他构件
29、,再将需要的所有构件组装成新系统。图5-4描述了软件重用的组装模型。5.2 软件重用和再工程5.2.2 软件重用的过程模型类构件的重用02利用面向对象技术,可以比较方便、有效地实现软件重用。面向对象技术中的类是比较理想的可重用软件构件,不妨称之为类构件。5.2 软件重用和再工程5.2.2 软件重用的过程模型类构件的重用继承重用 利用面向对象方法的继承性机制,子类可以继承父类已经定义的所有数据和操作,也可以另外定义新的数据和操作。为提高继承重用的效果,关键是设计一个合理的、具有一定深度的类构件继承层次结构。这样可以降低类构件的接口复杂度,提高类的可理解性,为软件开发人员提供更多可重用的类构件。实
30、例重用 按照需要创建类的实例,然后向该实例发送适当的消息,启动相应的服务,完成所需要的工作。多态重用 多态重用方法根据接收消息的对象类型,在响应一个一般化的消息时,由多态性机制启动正确的方法,执行不同的操作。5.2 软件重用和再工程5.2.2 软件重用的过程模型软件重用过程模型03为了实现软件重用,已经有许多过程模型,这些模型都强调领域工程和软件工程同时进行。所谓“领域”,是指具有相似或者相近软件需求的应用系统所覆盖的一组功能区域。可以根据领域的特性及相似性,预测软件构件的可重用性。领域工程就是分析、设计和构造具有重用价值的软件构件,进而建立可重用的软件构件库的过程。左图描述了适用于软件重用的
31、过程模型。领域工程在特定的领域中创建应用领域的模型,设计软件体系结构模型,开发可重用的软件成分,建立可重用的软件构件库。显然,对软件构件库应当不断地积累构件、不断地进行完善。5.2 软件重用和再工程5.2.2 软件重用的过程模型软件重用过程模型03基于构件的软件工程,根据用户的实际需求,参照领域模型进行系统分析,使用领域的结构模型进行结构设计,从可重用软件构件库中查找需要的构件,对构件进行鉴定、调整以构造新的软件构件,对软件构件进行组合以开发应用软件,软件构件不断更新,并补充到可重用软件构件库中去。5.2 软件重用和再工程5.2.3 开发可重用的软件构件领域工程开发可重用的软件构件 为了开发可
32、重用的软件构件,应该考虑以下问题:标准的数据结构、标准的接口协议、设计程序模板等。分析过程 领域工程分析过程的主要任务是标识可重用的软件构件。传播软件构件 传播软件构件就是让用户能在成千上万的软件构件中找到他所需要的构件,这需要很好地描述构件。构件的描述包括构件的功能、使用条件、接口和如何实现等。构件如何实现的问题,只有准备修改构件的人需要知道,其他人只要了解构件的功能、使用条件和接口即可。1领域工程5.2 软件重用和再工程5.2.3 开发可重用的软件构件 随着软件构件的不断丰富,软件构件库的规模会不断扩大,软件构件库组织结构的合理性将直接影响构件的检索效率。库结构的设计和检索方法的选用,应当
33、尽量保证用户容易理解、便于使用。对可重用软件构件库要进行分类,以便于用户检索使用。软件构件分类的方法有3种典型模式:枚举分类、刻面分类和属性值分类枚举分类、刻面分类和属性值分类。2分类和检索软件构件5.2 软件重用和再工程5.2.3 开发可重用的软件构件枚举分类01枚举分类方法通过层次结构来描述构件,在该结构中定义软件构件的类以及子类的不同层次。它把实际构件放在枚举层次的适当路径的最底层。枚举分类模式的层次结构容易理解和使用,但在建立层次之前必须完成领域工程,以使层次中的项具有足够的信息。5.2 软件重用和再工程5.2.3 开发可重用的软件构件刻面分类02 分析应用领域并标识出一组基本的描述特
34、征,这些描述特征称为刻面。描述一个构件的刻面的集合称为刻面描述表。根据重要性确定刻面的优先次序,并把它们与构件联系起来。刻面可以描述构件所完成的功能、加工的数据、应用构件的操作和实现方法等特征。通常,刻面描述不超过7个。把关键词的值赋给重用库中每个构件的刻面集。使用自动工具完成同义词词典功能,从而可以根据关键词或关键词的同义词,在构件库中查找所需要的构件。刻面分类方法通过分析软件构件的基本特征,并分析这些基本特征的优先次序,来建立软件构件库。5.2 软件重用和再工程5.2.3 开发可重用的软件构件属性值分类03属性值分类模式是指为一个领域中的所有构件定义一组属性,然后与刻面分类法类似地给这些属
35、性赋值。属性值分类法与刻面分类法相似,区别如下:对可重用的属性个数没有限制。属性没有优先级。不使用同义词词典功能。5.2 软件重用和再工程5.2.4 软件逆向工程逆向工程是一种产品设计技术的再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素,以制作出功能相近,但又不完全一样的产品。简单地说,逆向工程就是根据已有的产品,反向推出产品设计数据(包括各类设计图或数据模型)的过程。因此,逆向工程可以被认为是一个从产品到设计的过程。5.2 软件重用和再工程5.2.4 软件逆向工程软件的逆向工程是分析程序,力图在比源代码更高的抽象层次上,建
36、立程序的表示过程。它不仅是设计的恢复过程,还可以借助工具从已经存在的程序中抽取数据结构、体系结构和程序设计信息。软件逆向工程也可被视作“开发周期的逆行”。对一项软件程序进行逆向工程,类似于逆行传统瀑布模型中的开发步骤,即从实现阶段的输出(即软件程序)还原出在设计阶段所做的构思。软件逆向工程仅仅是一种检测或分析的过程,它并不会更改目标系统。软件的逆向工程可以使用净室技术(将在第11.2节介绍)来避免侵犯版权。5.2 软件重用和再工程5.2.4 软件逆向工程图5-6 软件逆向工程的过程及可能恢复的信息处理规则构件调用伪代码数据、控制流程图数据结构图数据接口表测试路径源代码静态分析数据字典E-R图模
37、块、变量表5.2 软件重用和再工程5.2.4 软件逆向工程分析通过信息交换所得的观察分析通过信息交换所得的观察最常用于协议逆向工程,涉及使用总线分析器和数据包嗅探器。在接入计算机总线或网络的连接,并成功截取到通信数据后,可以对总线或网络行为进行分析,以制造出拥有相同行为的通信实现。此法特别适用于设备驱动程序的逆向工程。1反汇编反汇编使用反汇编器把程序的原始机器码翻译成较便于阅读理解的汇编代码。这适用于任何的计算机程序,对不熟悉机器码的人特别有用。流行的相关工具有OllyDebug和IDA。2反编译反编译使用反编译器尝试从程序的机器码或字节码中重现高级语言形式的源代码。3软件逆向工程的实现方法很
38、多,主要有以下3种。随着计算机技术在各个领域的广泛应用,特别是软件开发技术的迅猛发展,基于某个软件,以反汇编阅读源码的方式去推断其数据结构、体系结构和程序设计信息,成为软件逆向工程技术关注的主要对象。目前主流应用的四大逆向工程软件为:Imageware Surfacer,Geomagic Studio,CopyCAD,RapidForm。5.2 软件重用和再工程5.2.4 软件逆向工程软件逆向技术的目的是用来研究和学习先进的技术,特别是当手里没有合适的文档资料,又很需要实现某个软件功能的时候。也正因为这样,很多软件为了垄断技术,在软件安装之前,要求用户同意不去逆向研究。5.2 软件重用和再工程
39、5.2.5 软件再工程软件再工程(Reengineering)是软件逆向工程的扩充。软件逆向工程提取需要的信息后,软件再工程基于对原系统的理解和转换,在不变更整个系统功能的前提下,生产新的软件源代码。软件工程的再工程是以软件工程方法学为指导,对既有对象系统进行调查,并将其重构为新形式代码的开发过程。5.2 软件重用和再工程5.2.5 软件再工程软件再工程的成本取决于重做工程的难度。源代码转换最便宜,程序结构重构次之,接下来是程序和数据重构,而体系结构迁移成本最高。尽管如此,软件再工程与重新开发软件相比,成本和风险还是更小一些,原因是开发软件的起点不同。在软件再工程的各个阶段,软件的可重用程度都
40、将决定着软件再工程的工作量。由于软件规模庞大,种类很多,因此不是每个软件都需要进行再工程。大多数情况下,那些决定要移植、或要重新设计、或为复用而需验证其正确性的程序才被选择实施再工程。目前再工程最成功的例子是人们理解深刻、相对稳定的一些领域,如信息系统等。5.2 软件重用和再工程5.2.5 软件再工程再分析阶段01再分析阶段的主要任务是对既存系统的规模、体系结构、外部功能、内部算法、复杂度等进行调查分析。这一阶段早期分析的最直接目的就是调查和预测再工程涉及的范围。重用是软件工程经济学最重要的原则之一,重用得越多,再工程成本越低。所以,再分析阶段最重要的目的是寻找可重用的对象和重用策略,最终确定
41、的再工程任务和工作量也将依存于可重用对象范围和重用策略。再工程分析者最终提出的重用范围和重用策略将成为决定再工程成败以及再工程产品系统可维护性高低的关键因素。5.2 软件重用和再工程5.2.5 软件再工程再编码阶段02根据再分析阶段做成的再工程设计书,再编码阶段将在系统整体再分析的基础上对代码做进一步分析。如果说再分析阶段的产品是再工程的基本设计书,那么再编码阶段就要产生类似详细设计书的编码设计书。不过注意到再工程是个整体,无法将再分析、再设计、再编码截然分开,因此瀑布模型更不适应再工程。5.2 软件重用和再工程5.2.5 软件再工程再测试阶段03一般来说,再测试是再工程过程中工作量最大的一项
42、工作。如果能够重用原有的测试用例及运行结果,将能大大降低再工程成本。对于可重用的部分,特别是可重用的局部系统,还可以免除测试,这也正是重用技术被再工程高度评价的关键原因之一。当然,再工程后的系统总有变动和增加的部分,对受其影响的整个范围都要毫无遗漏地进行测试。本章小结本章小结 软件维护就是在软件产品交付之后对其进行修改,以排除故障,或改进性能和其他属性,或使产品适应改变了的环境。软件维护分为4种,即改正性维护、适应性维护、完善性维护、预防性维护。软件可维护性是指软件功能被理解、改正、适应和增强的难易程度,是维护人员对软件进行维护的难易程度。可维护性是指导软件工程各阶段的一条基本原则,提高可维护性是软件工程追求的目标之一。在软件开发时明确质量目标、考虑软件的维护问题是必需的、重要的。在软件开发阶段提供完整的、一致的文档,采用先进的软件开发方法和软件开发工具是提高软件可维护性的关键。在软件维护时,目前常采用软件重用技术、逆向工程和再工程。本章小结