【案例四】(共25分)
阅读以下关于系统运行与维护的叙述,在答题纸上回答问题1至问题3。
【说明】
某企业经过多年的信息化建设,存在大量的应用软件系统,为了保证这些系统的运行与维护,专门组建应用系统维护部门。该部门的主要工作是保证系统的正常运行、处理问题以及扩展这些应该系统的功能,以满足企业业务功能的变化与扩展。
目前该部门存在人员流失、变更频繁,文档丢失或长期失于维护,维护成本愈来愈高等问题,具体表现为:
问题(1):随着时间和人员的变动,程序被多人修改,往往导致程序难以理解,注释混乱,流程复杂;
问题(2):随着不断修改程序和增加新的功能,模块之间的耦合关系日益复杂,维护成本不断增加。
这些问题导致新来的维护人员需要直接面对大量流程、结构复杂的源程序,维护困难,往往一次改动需要设计大量的软件模块。
为解决应用系统维护部门面对的问题,企业信息部门组织了专门的专家讨论会。各位专家一致认为,逆向工程与重构工程是目前预防性维护采用的主要技术,应该采用逆向工程的技术方法,重构相关应用系统文档,同时采用软件重构来降低软件代码的复杂性,最终降低维护成本。
【问题1】
软件的逆向工程是分析已有程序,寻求比源代码更高级的抽象表现形式。与之相关的概念包括软件重构、设计恢复、重构工程等。请说明设计恢复中常见的恢复信息的4种级别。
恢复信息的级别:
(1)实现级:包括程序的抽象语法树、符号表等信息;
(2)结构级:包括反映程序分量之间相互依赖的关系的信息,调用图、结构图等;
(3)功能级:包括反映程序功能与程序之间关系的信息;
(4)领域级:包括反映程序分量或程序诸实体与应用领域概念之间对应关系的信息。
【解析】
软件的逆向工程是分析程序,力图在比源代码更高抽象层次上建立程序表示的过程。逆向工程是一个恢复设计的过程,从现有的程序中抽取数据、体系结构和过程的设计信息。恢复信息的级别分为:实现级、结构级、功能级和领域级。其中,实现级主要包括程序的抽象语法树、符号表等信息;结构级主要包括反映程序分量之间相互依赖的关系的信息,调用图、结构图等;功能级主要包括反映程序功能与程序之间关系的信息;领域级主要包括反映程序分量或程序诸实体与应用领域概念之间对应关系的信息。
【问题2】
重构是对软件内部结构的一种调整,目的是不改变软件功能的前提下,提高其可理解性,降低其修改成本。请说明软件重构的三个类别,并简要说明常见的重构方法。针对题干中的问题(1)和问题(2),宜采用何种重构方法?
软件重构一般分为三类:
(1)代码重构;(2)模块重构;(3)架构重构。
常见的重构方法有:重新组织函数、重新组织对象、重新组织数据、简化条件表达式、简化函数调用和处理概括关系。
针对问题(1),采用代码重构,重新梳理代码流程,使代码容易理解和维护;
针对问题(2),采用模块東构和架构重构,梳理模块之间的关系,使其更容易扩展和维护,降低模块之间的耦合度。
【解析】
软件重构的目的主要有四个方面:一是改进软件设计,帮助重新设汁代码、重新体现设计结构和进一步改进设计;二是提高代码质量,更易被理解,这样很容易维护和进一步开发;三是可以帮助尽早发现错误,因为重构是一个代码的反馈过程,是在另一个时段重新审视自己或别人的代码,更容易发现问题和加深对代码的理解;四是提高开发速度,因为对设计和代码改进,都有利于提高开发速度。
软件重构-般分为三类:代码重构、模块重构和架构重构。基于代码重构的重构通常是按照闭队的规范整理代码,使其结构吏规范;基于模块重构是将代码封装,以便多次复用;基于架构重构的重构通常是实现软件的解耦,提髙软件的可扩展性和灵活性。
常见的重构方法有:重新组织函数、重新组织对象、重新组织数据、简化条件表达式、简化函数凋用和处理概括关系。
根据以上所述,针对问题(1)显然应采用代码重构,重新梳理代码流程,使代码容易理解和维护;针对问题(2)显然应采用模块重构和架构重构,梳理模块之间的关系,使其更容易扩展和维护,降低模块之间的耦合度。
【问题3】
软件重构做出的修改可能导致程序运行变慢,但也更容易进行软件的性能优化和调整,请分析原因。
一个模块化程度好的程序可从两方面帮助性能优化。
(1)分解良好的程序,使得性能分析的粒度更细,性能调整更加容易;
(2)分解良好的程序,由于代码更加淸晰,更容易与性能优化工具结合,分析系统性能瓶颈的具体位置。
【解析】
模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。模块具有以下几种基本属性:接口、功能、逻辑、状态,功能、状态与接口反映模块的外部特性,逻辑反映它的内部特性。在软件的体系结构中,模块是可组合、分解和更换的单元。
事实上,将软件分解成若干模块,则工作量会减少。但分解的模块越多,工作最不一定越少,因为分解到一定程度,模块之间的接口工作量就上升,从而使总代价上升。一个软件系统划分模块数的最佳值是M。从心理学角度研究表明,一个模块的大小最好在30〜50个语句之间,即能全部写在一页打印纸上为限。一个模块化程度好的程序可从两方面帮助性能优化:一是使得性能分析的粒度更细,性能调整更加容易;二是由于代码更加淸晰,更容易与性能优化工具结合,分析系统性能瓶颈的具体位置。