(计算机应用技术专业论文)基于切片度量的重构定位方法设计与研究.pdf_第1页
(计算机应用技术专业论文)基于切片度量的重构定位方法设计与研究.pdf_第2页
(计算机应用技术专业论文)基于切片度量的重构定位方法设计与研究.pdf_第3页
(计算机应用技术专业论文)基于切片度量的重构定位方法设计与研究.pdf_第4页
(计算机应用技术专业论文)基于切片度量的重构定位方法设计与研究.pdf_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

上海师范大学硕士学位论文基于切片度量的重构定位方法设计与研究 摘要 在软件生命周期里,软件重构是提高软件内部质量的关键技术,而重构定位 是重构首要解决的问题。传统的重构定位方法都是基于“坏味道”的主观判断, 缺少自动化重构定位的工具支持。目前,已有的重构定位的方法比较低效,所以 如何高效定位软件重构的位置是一个亟待解决的课题。 论文首先介绍了软件重构的定义、过程和按不同粒度划分的重构定位。接着, 研究和分析了三种重构定位方法:基于b a ds m e l l 的重构定位的方法,基于不变 式的重构定位的方法和基于度量规则的重构定位的方法等,并对这三种重构定位 方法进行分析,比较它们的优缺点。针对基于度量的重构定位不能动态分析程序 和没有考虑多态的缺点,本文提出了基于切片度量的重构定位方法。 基于切片度量的重构定位方法,通过动态分层切片动态地分析程序,计算类 级、方法级和属性级的内聚度和耦合度,根据度量的内聚度和耦合度结果来识别 代码中的“坏味道,达到横向重构定位和纵向重构定位的目的。 论文最后对基于切片度量方法的重构定位工具进行建模,并通过实验比较基 于切片度量的重构定位方法与其他方法。实验表明,该方法更加有效。 关键词:软件重构,重构定位,动态分层切片,切片度量 a b s t r a c t i nt h es o f t w a r el i f ec y c l e ,s o f t w a r er e f a c t o r i n gi sak e yt e c h n i q u et oi m p r o v e t h e i n t e m a ls o f t w a r eq u a l i t y , w h i c hi st oe l i m i n a t eb a ds m e l lc o d ew i t h o u tc h a n g i n gi t s o b s e r v a b l eb e h a v i o r a n dt h er e f a c t o r i n gl o c a t i o ni s t h ep r i m a r yp r o b l e mi nt h e r e f a c t o r i n g t h et r a d i t i o n a lm e t h o do fr e f a c t o r i n gl o c a t i o ni sb a s e d o nh u m a ni n t u i t i o n w h i c hl a c ko ft h ea u t o m a t i cs u p p o r t i n gt 0 0 1 a tp r e s e n t ,t h em e t h o d so fr e f a c t o r i n g l o c a t i o na r ei n e f f i c i e n t t h e r e f o r e ,i t i s u r g e n tt os o l v et h a t h o wt ol o c a t et h e r e f a c t o r i n ge f f i c i e n t l y f i r s t l ui tw a si n t r o d u c e dt h es o f t w a r er e f a c t o r i n g i nt h ep a p e r t h e r ea r e d a r t i c u l a rp r e s e n t a t i o n sa b o u tt h eg e p s a b o u th o wt oc a r r yt h r o u g hs o f t w a r e r e f a c t o r i n ga n dt h et y p eo f t h es o f t w a r er e f a c t o r i n g s e c o n d l yi tw a si n t r o d u c e dt h r e em e t h o d so fr e f a c t o r i n gl o c a l i z a t i o na sf o l l o w : m em e t h o db a s e do nb a ds m e l l ,t h em e t h o db a s e do ni n v a r i a n t ,t h em e t h o db a s e d o n m e t r i c m o r e o v e lw ec o m p a r ew i t ht h et h r e em e t h o d sa n da n a l y z et h e i ra d v a n t a g e s a n dd i s a d v a n t a g e s w ef i n dt h em e t h o db a s e do nm e t r i c ss h o r t c o m i n g , i n c l u d e i g n o r i n gd y n a m i ca n a l y z i n gp r o g r a m a n dp o l y m o r p h i c i no r d e rt os o l v e t h e s e p r o b l e m s ,w ep r o p o s er e f a c t o r i n g l o c a t i o nb a s e do ns l i c i n gm e a s u r e r e f a c t o r i n gl o c a l i z a t i o nb a s e do nm e t r i cu s ed y n a m i ch i e r a r c h i c a ls l i c i n g t o a n a l y s i sp r o g r a ma n dc a l c u l a t e st h ec o u p l i n ga n dc o h e s i o no nt h ec l a s sl e v e l ,m e t h o d l e v e la n da t t r i b u t el e v e l a c c o r d i n gt ot h em e a s u r er e s u l t ,w ec a l li d e n t i f yt h eb a d s m e l l i nt h ec o d ei no r d e rt ol o c a t et h es o f t w a r eh o r i z o n t a l l ya n dv e r t i c a l l y a tl a s t ,t h em e t h o do fr e f a c t o r i n gl o c a l i z a t i o nw a sa p p l i e d i n t op r o j e c t c o m p a r e d w i t ho t h e rm e t h o d s ,i ti sp r o v e dt h a tt h i sm e t h o di sm o r ee f f e c t i v e t h i sm e t h o dc a n l o c a t ee f f e c t i v e l ya n dc o r r e c t l y k e y w o r d s :s o f t w a r er e f a c t o r i n g ,r e f a c t o r i n gl o c a t i o n ,d y n a m i c h i e r a r c h i c a ls l i c i n g , s l i c i n gm e a s u r e i i 论文独创性声明 本论文是我个人在导师指导下进行的研究工作及取得的研究成果。论文中除 了特别加以标注和致谢的地方外,不包含其他人或机构已经发表或撰写过的研究 成果。其他同志对本研究的启发和所做的贡献均己在论文中做了明确的声明并表 示了谢意。 储签名$ 私嗍厶,o t a i 论文使用授权声明 本人完全了解上海师范大学有关保留、使用学位论文的规定,即:学校有权 保留送交论文的复印件,允许论文被查阅和借阅;学校可以公布论文的全部或部 分内容,可以采用影印、缩印或其它手段保存论文。保密的论文在解密后遵守此 规定。 作者签磷举每导师虢高砰吼洲“f 上海师范人学硕士学位论文第一章绪论 第一章绪论 1 1 论文研究背景 在软件的生命周期中,软件维护是最后一个阶段,也是时间最长、花费代价 最大的一个阶段。据统计,用于软件维护的费用占软件总费用的5 5 , - - - 7 0 t 。 在软件的维护过程中,程序员需要不断地修改软件,需要添加新特性和改变原有 的行为。在修改代码的过程中,会改变原有的软件结构和组织。代码中类会变得 更大,方法变得更长,逻辑结构更复杂。这些改变会使得软件系统变得越来越复 杂,直接影响软件质量的好坏。 为了改进软件维护中修改软件带来的质量问题,人们提出了另一种围绕软件 设计的修改软件的方法。这些方法中,软件重构技术作为提高软件质量的主要技 术受到了人们的重视。软件重构是指在不改变软件行为的前提下改善已有的软件 结构和组织【2 j 。重构的目的是提高软件的理解性,更容易维护。 然而,软件重构技术的应用目前并没有达到人们的期望,尤其是对软件重构 定位的方法和重构工具的研究。在实施软件重构方法之前,必须知道在什么位置 重构,即软件重构定位。在整个软件重构过程中,软件重构定位是首要解决的问 题,是软件重构顺利进行的保证。重构定位是一个复杂而繁琐的过程。重构定位 主要识别出软件结构设计有缺陷的位置,这些位置通常用“坏味道 ( b a ds m e l l ) 来表示。传统的重构定位方法主要通过人的主观判断来识别代码中的“坏味道”。 人工识别的低效率制约了软件重构技术的快速发展。为了解决过于依赖人的经验 问题,人们提出了基于软件度量的重构定位的方法【3 j ,希望通过软件度量为软件 重构定位提供客观量化的依据。但是现有的基于软件度量的方法识别出的代码“坏 味道”非常有限,并且创建出的重构工具没有完全实现自动化,还要依赖人的判 断。所以研究更加全面的重构定位方法和自动重构定位工具,将能加快软件定位 的速度,对软件重构的实际应用具有很大的意义。 目前国外研究的重构定位方法主要有:基于b a ds m e l l 的重构定位方法,基 于不变式的重构定位方法和基于度量的重构定位方法。 基于b a ds m e l l 的重构定位方法【4 j :程序员依靠自己的经验,判断出程序代码 中符合“坏味道 规则的代码。定位前已经定义了一系n - n 定代码“坏味道”的 规则和解决“坏味道”的方法。针对识别出的“坏味道”,采取相应的重构方法。 这种方法的优点是不受其他条件的制约,操作很方便,但是这种方法对程序员的 要求很高。对于规模较大的软件系统,识别工作耗时费力,重构的效率很低。 基于不变式的重构定位方法【5 】【6 】:通过d a i k o n 自动化工具分析,获取代码中 的不变式。根据所得不变式,识别重构的前提条件。如果满足条件,则对代码采 用相应的重构方法。该方法的优点是采用d a i k o n 工具能动念的分析程序,不需 第一章绪论 上海师范大学硕士学位论文 要靠人的经验。但是这种方法只能在程序执行的时候使用,受程序的覆盖率影响, 定位的结果不够精确。代表的工具主要有n e b u l o u s 。 基于度量的重构定位方法f 7 】【1 6 】:该方法将软件度量和软件重构结合在一起。 首先通过软件度量规则来量化代码中的“坏味道”,然后利用度量结果来分析代码 结构,从而识别到有缺陷的代码。该方法的优点是软件度量指标有助于“坏味道” 的量化,能加快识别定位的速率。不足的地方是只能静态的分析代码,并且定位 的精确因度量的规则不同而有偏差。代表的工具主要有p r o d e t e c t i o n 。 1 2 论文的主要工作 本文主要工作包括以下几方面的内容: ( 1 ) 按照粒度不同,划分了软件重构:代码级重构、设计级重构和软件系统结 构的重构,并将代码级重构细分为类级重构、方法级重构和属性级重构。 ( 2 ) 分析比较了三种重构定位的方法:基于b a ds m e l l 的重构定位方法、基于 不变式的重构定位方法和基于度量的重构定位方法。 ( 3 ) 改进了面向对象的静态分层切片,提出了面向对象的动态分层切片。 ( 4 ) 研究了基于动态分层切片的度量方法,并将其应用到软件重构定位的方法 中,提出一种基于切片度量的重构定位方法。 ( 5 ) 建立了基于该方法的重构定位工具模型,将该方法应用到实际项目中,并 将基于切片度量的方法与已有的基于度量的方法进行比较分析。 1 3 论文创新点 论文的创新点如下: ( 1 ) 改进了传统的静态分层切片,提出了一种新的动态分层切片; ( 2 ) 使用动态分层切片,度量不同抽象层的内聚度和耦合度,并建立了形式化 的公式; ( 3 ) 根据动态分层切片度量的结果,提出了基于切片度量的重构定位方法; ( 4 ) 将重构定位分成横向重构定位和纵向重构定位,以达到不同的重构目的; ( 5 ) 设计了基于切片度量的重构定位工具模型。 1 4 论文的章节安排 本论文的章节安排如下: 第一章绪论。介绍了论文的研究背景、主要工作、论文创新点和章节安排。 第二章软件重构。简要介绍软件重构的定义、意义和步骤,并将重构按不同 的粒度进行分类。 第三章重构定位方法的研究。对目前三种重构定位方法进行介绍,分析比较 这些方法的优缺点。 第四章程序切片技术。介绍了程序切片的概念和分类,改进了传统的静态分 2 上海师范大学硕士学位论文 第一章绪论 层切片,提出了一种动态分层切片。 第五章基于切片度量的重构定位方法。利用动态分层切片度量不同层次代码 的内聚度和耦合度,根据度量结果来达到重构定位的目的。并通过实例对该方法 定位重构进行说明。 第六章重构定位工具设计及实验分析。建立了基于该方法的工具模型,将该 方法应用于上海轨道交通6 号线c p u 卡改造项目中,并与其他的方法进行比较。 第七章总结与展望。对本论文的工作进行总结并提出未来的工作。 1 5 关于论文实验背景的说明 上海星禾智能设备有限公司“上海轨道交通六号线c p u 卡改造项目”主要在 原有的轨道交通六号线上增加新的功能,软件的功能变大,软件的需求增加。添 加了一种新的c p u 卡,项目重新二次开发不现实,而是在原有的代码基础上进行 再工程。在添加代码的过程中,原来的代码的“坏味道”越来越多。为了使得代 码便于理解和后期便于维护,对代码的重构显得尤为重要。 第二章软件重构概述上海师范大学硕士学位论文 第二章软件重构概述 2 1 软件重构的定义 目前,对重构定义没有统一的规定,以下从不同的角度定义软件重构: o p d y k e 2 】最早将软件重构定义在保留程序的行为前提下,通过各种手段重新 整理程序结构,使程序更容易理解,从而提高软件的可维护性。 f o w l e r 在o p d y k e 的定义基础上将重构定义分为名词和动词两种形式【9 】。名 词形式( r e f a c t o r i n g ) 的定义侧重于重构的目的,表示为:为了提高程序的理解 性,在不改变软件可观察行为前提下对程序内部结构的调整,从而降低修改成本。 动词形式( r e f a c t o r ) 更侧重重构的操作,表示为在不改变软件可观察行为前提下, 通过应用大量重构准则调整程序内部结构。 软件重构定义有两个要点:( 1 ) 软件重构只能改变软件的设计,即软件的结 构;( 2 ) 软件重构的前提是重构前后不能改变软件行为,即软件系统的输出不变, 软件功能不能改变。 2 2 软件重构的步骤与过程 重构有4 个关键步骤l lo j : ( 1 ) 软件重构定位是软件重构的第一步。通过软件重构定位的方法,找到代 码中“坏味道 的位置,并识别出“坏味道”的种类; ( 2 ) 根据识别出的“坏味道”选择相应的重构方法; ( 3 ) 在不改变软件行为的前提下,实施具体的重构方法; ( 4 ) 评测重构后的代码质量。 重构的步骤如图2 1 所示: 定位重构代码 选择董构方法 士 实施重构 士 评测重构后的代码 图2 - 1 重构软件系统的步骤图 f i g2 - 1t h es t e pf i g u r eo fr e f a c t o r i n gt h es o f t w a r es y s t e m 在实际的软件开发和维护中,重构没有得到广泛应用的一个障碍是重构定位 相当耗时费力,没有很好的自动化工具支持。由图2 一l 可知,重构定位影响到软 件重构方法的选择和重构的具体实施,重构定位是软件重构顺利进行的前提。本 4 上海师范人学硕士学位论文第二章软件重构概述 文主要关注软件重构过程的第一步,即重构定位。 2 3 重构定位的分类 软件重构可以运用于系统的各个抽象层次。根据系统规模大小不同,软件重 构的关注点也不同。根据重构粒度不同,将软件重构分为:软件代码级别重构、 软件设计级别重构和软件体系级别重构。 ( 1 ) 软件代码级重构 代码级重构抽象层次最低。基于面向对象c + + 语言的特点,将代码的重构划 分为类级重构、方法级重构和属性级重构。代码的自动重构涉及的问题比较广, 从最简单的变量改名,到将某段代码提炼为方法,再到类层次结构的修改。 ( 2 ) 软件设计级重构 设计级重构比代码级抽象级别高。随着软件的不断发展,软件内部的代码发 生变化,软件设计也相应的发生了变化。原有的设计已经不能满足软件的需求。 因此在软件设计中会利用软件设计模式来改进既有的软件设计。设计模式可以记 录重构产生的新的设计模式,并不断指导软件重构方法的选择。 ( 3 ) 软件体系级重构 体系级重构抽象层次最高。软件系统结构是组成系统的部件以及部件之间交 互作用关系的高层抽象。在大型软件系统中,软件工程师可以从体系结构层次把 握整个软件结构。改进软件体系结构重构可以控制软件复杂度、提高软件质量。 重构定位是软件重构的首要问题,因此重构定位按不同粒度可以划分为:软 件代码级重构定位、软件设计级重构定位和软件体系级重构定位。软件代码级重 构定位又划分为类级重构定位、方法级重构定位和属性重构定位。重构和重构定 位级别关系如表2 1 所示。 t a b l e2 - 1t h el e v e lr e l a t i o n s h i po fr e f a c t o r i n ga n dr e f a c t o r i n gl o c a t i o n 表2 1 重构及重构定位类别 级别重构重构定位 软件体系级软件体系级重构软什体系级重构定位 软件设计级 软件设计级重构软件设计级重构定位 类级重构类级重构定位 软件代码级方法级重构方法级重构定位 属性级重构属性级重构定位 由表2 1 可知,软件代码级重构定位的粒度最小,而软件体系级重构定位粒 度最大。本文主要研究代码级重构定位的方法。 2 4 本章小节 本章作为本文提出软件重构定位新方法的理论基础为后文做铺挚。本章主要 第二章软件重构概述 上海师范大学硕十学位论文 介绍了软件重构的定义过程与步骤,描述了重构定位在整个重构过程的重要角色, 重点将重构定位按粒度进行划分。为了研究新的重构定位方法,对面向对象软件 重构的特点、软件重构定位在软件重构过程的地位和软件重构定位的分类方面内 容的了解是必不可少的。 6 上海师范大学硕士学位论文第三章重构定位方法的研究 第三章重构定位方法的研究 本章主要介绍了重构定位的相关方法,包括基于b a ds m e l l 重构定位方法、 基于不变式重构定位方法和基于度量重构定位方法。 3 1 基于b a ds m e l l 的重构定位方法 3 1 1b a ds m e l l 的定义 b a ds m e l l 可以直译为“坏味道”。用b a ds m e l l 描述代码时,主要表示代码 结构有缺陷,暗示代码可能存在问题需要重构。m a r t i nf l o w l e r 4 1 整理出2 2 种“坏 味道”情况,并给出了评判的方法。以下是较为常见的5 类“坏味道”: ( 1 ) 重复代码( d u p l i c a t e dc o d e ) 。重复代码是最常见也是干扰较大的坏昧。 重复代码可以表现为两段相同的代码,也可以是两段作用相同的代码。例如,在 同一个类的两个函数有相同的表达式;在同一个类中有两个作用相同但是表达式 不同的函数。重复的代码使得软件变得越来越复杂,不利于软件的长期维护。产 生重复代码的原因诸多,很难避免。不同的程序员会被分配在开发软件系统的不 同部分。但是有时开发人员变更后,许多程序员宁愿重写代码也不愿意在以前程 序员的代码基础上修改。 ( 2 ) 方法过长( l o n gc o d e ) 。每个类包含许多方法,方法的长短直接影响对 代码的理解。一般方法宜短不宜长。一个长方法内部可能包括许多功能,这不利 于对代码的理解。通常可以将长方法分解成若干个小方法,并为每个小方法分别 命名从而提高代码的理解。两个长方法之间也可能存在重复交叠,这不利于代码 的维护。如果在原有的方法中添加新的功能,将导致方法变长,代码变得难以理 解。这里长度是个相对概念。根据功能的大小、方法的长度不同,不能绝对量化 代码一定存在“坏味道”。 ( 3 ) 基本类型偏执( p r i m i t i v eo b s e s s i o n ) 。基本的数据类型( 如i n t 、d o u b l e 、 f l o a t ) 已经满足不了大型复杂软件需求。通常会把基本的类型组合成新的结构类 型。例如,将圆柱体的长、宽、高构造成圆柱体对象。经过封装后的结构类型更 加安全并且有助于扩展新的代码。 ( 4 ) 依恋情结( f e a t u r ee n v y ) 和不当的亲昵关系( i n a p p r o p r i a t ei n t i m a c y ) 。 依恋情结是指函数被其它类使用的频率高于宿主类( h o s tc l a s s ) 使用的频率。不 当的亲昵关系是指两个元件之间的关系过于亲密,耦合度较高。依恋情节和不当 的亲昵关系产生的原因相同,都是因为类之间存在着耦合关系,但它们的表现形 式不同。依恋情节主要表现一个方法过于调用其它类的数据,而不是采用其本身 所在类的数据。不当的亲昵关系指一个类访问其父类或其它类的内部成员变量或 方法,使两个类产生交叠,而本身这些成员变量或方法应该是私有的。 ( 5 ) s w i t c h 分支语句( s w i t c hs t a t e m e n t ) 。s w i t c h 语句暗示着该处代码有重 7 第三章重构定位方法的研究上海师范人学硕士学位论文 复。这里不是指所有的s w i t c h 语句,主要二次连续使用s w i t c h 语句。在满足一个 条件的s w i t c h 语句前提下,同时满足新的条件,程序员继续增加s w i t c h 语句,这 样重复不可避免。在面向对象语言中的多态可以解决这种二次连续使用s w i t c h 语 句的问题。 3 1 2 基于b a ds m e l l 的重构定位方法 基于b a ds m e l l 的重构定位方法主要依赖人的主观判断。程序员根据已有的 “坏味道”判定规则来分析程序中的代码,一旦程序符合b a ds m e l l 判定规则, 即定位到需要重构的代码。“坏味道”没有绝对统一的标准,判定“坏味道”是 否存在需要综合考虑其周围的环境。消除一种“坏味道”,会引起新的“坏味道 , 即“波纹效应 【1 1 1 。所以这种识别不是自动化的,需要借助人工的帮助。“坏味 道”一般用自然语言或u m l 符号来表示。 例如,依赖情结可描述如图3 1 所利1 2 】。 图3 - 1 依恋情结的形式化规则 f i g3 - 1f o r m u l a t i o nr u l eo ff e a t u r ee n v y 横线上描述了4 类对象,其中定义了两个类c l a s sa 、c l a s sb ,方法a m e d 以 及方法集合b m d 。横线下面描述了这4 类对象的关系,c r e a t e 表示创建关系,即 a m d 方法对c l a s sa 类进行了引用。m e m b e r 和i n v o k e 分别表示成员关系和调用 关系。上例是说一个类中的某个方法对另一个类对象的多个方法进行了调用,这 种过多调用造成了一个类中方法对其它类的依恋。 3 1 3 基于b a ds m e l l 的重构定位方法的特点 基于b a ds m e l l 的重构定位方法优点: 程序员可以直接根据现有的“坏味道”判定规则快速识别出代码中的缺陷。 对于较短的程序,该方法不受其他条件约束操作方便。 其缺点在于: ( 1 ) 主要通过人工来识别软件的缺陷,对程序员的素质要求高。 ( 2 ) 如果重构的程序规模较大,将消耗的很多的精力和时间,使得软件重构 8 上海师范大学硕十学位论文 第二章重构定位方法的研究 效率比较低。 ( 3 ) “坏味道”的表示方法多采用自然语言容易造成语义不清,难以实现自 动化重构。 3 2 基于不变式的重构定位方法 3 2 1 不变式的定义和分类 不变式是指在程序中用公式来表示所有变量之间的关系。例如:在某个函数 的入口,变量a 、b 和c 有不变式:a = b + 2 * c 。无论该函数怎么编写,不变式始终 成立。w i l l 锄f o p d y k e l l 4 】研究主要关注面向对象的自动化重构。基于b a n e r j e e 和 k i m u q 对面向对象数据库模式的研究,o p d y k e 定义了7 个基于c + + 的不变式。将 不变式按不同级别划分,见表3 1 。 t a b l e3 1t h et y p eo fi n v a r i a n t s 表3 1 不变式的类型 级别不变式名称 类级别 唯一超类、不同的类名 成员级别 不同的成员名、被继承的成员变量不能被重定义 函数级别 成员函数重定义签名兼容 其他 类型安全的赋值、语义等价的引用和操作 ( 1 ) 唯一超类。一个类至多只有一个超类,这个不变式只研究单继承系统。 ( 2 ) 不同的类名。在整个程序中,每个类的类名是唯一的,不考虑类的嵌套。 ( 3 ) 不同的成员名。每个类的方法名和成员变量名称都是唯一的,但允许在 子类中重载超类中的方法。 ( 4 ) 被继承的成员变量不能被重定义。不允许在子类中重载超类中成员变量。 ( 5 ) 成员函数重定义签名兼容。当签名兼容时,允许在子类中重载超类中的 函数。 ( 6 ) 类型安全的赋值。赋值运算和函数调用中的表达式类型要同变量定义的 类型一致。 ( 7 ) 语义等价的引用和操作。语义等价是让程序的外部接口是通过主函数 m a i n ,如果m a i n 函数用相同的输入集被调用两次( 一次在重构前,一次在重构后) , 产生的输出集必须是相同的。 3 2 2 基于不变式的重构定位方法 基于不变式的重构定位方法【5 】第一步使用d a i k o n 工具动态识别程序中的不 变式,然后利用程序中不变式来识别重构的前提条件。如果满足重构方法的前提 条件,直接采用相应重构方法对代码进行重构。该方法的主要特点就是基于对程 9 第三章重构定位方法的研究上海师范人学硕十学位论文 序运行的行为进行动态的分析。基于不变式的重构定位的方法过程如图3 2 : d a i k o n t 具识别程序巾一i 变最 上 利用不变式识别重构的条件 一1fi 1 l v, 使用相应重构方法 f结束 图3 2 基于不变式的重构定位方法的过程 f i g3 - 2t h es t e po fl o c a t i o nr e f a c t o r i n gb a s e do ni n v a r i a n t 在d a i k o n 工具动态的识别出不变式后,利用不变式可以识别出重构方法的前 提条件。如果满足重构方法的前提条件,就直接采用重构方法;否则,退出。该 方法给出了五种利用不变式来识别重构方法的前提条件。 ( 1 ) 删除参数。 在重构过程中,删除参数包括删除声明和所有被调用的参数。删除参数后, 函数外部的参数变得难以理解。删除参数执行的前提条件包括: a ) 方法不再使用参数; b ) 参数是常数或者由其它变量计算而得。 ( 2 ) 消除返回值。 消除返回值的基本原理和删除参数相同。消除返回值执行的前提条件包括: a ) 返回值对函数调用不重要; b ) 返回值是常数或者可以由其它变量计算而得。 ( 3 ) 将查询函数从修改函数中分离。 将查询函数从修改函数中分离是指把一个简单的函数分为两个操作:返回查 询操作的结果和执行修改操作。它的基本原理是为每一条操作定义唯一明确的操 作目标,以此来确认客户端需要执行查洵操作还是修改操作,并创建了无副作用 的过程,该过程可以被随意地插入或删除。存在的问题是过程名或文件名不能彻 底清除副作用。将查询函数从修改函数中分离的执行前提条件包括: a ) 函数返回值是一个常数; b ) 函数返回值改变了对象的状态。 ( 4 ) 封装向下转型。 :l 0 上海师范大学硕士学位论文第三章重构定位方法的研究 封装向下转型改变了返回类型,并且将向下转型操作移入到方法中。封装向 下转型的基本原理是减少静态向下转型的操作数并为客户端简化程序的含义,使 程序更易理解。封装向下转型也可以允许类型控制被静态执行( 在编译阶段) 而 不是被动态执行( 在运行阶段) ,这对于早期的错误探测和改进性能都有好处。封 装向下转型操作的前提条件为返回对象的类型与对象中方法的返回类型不相同。 ( 5 ) 以查询代替临时变量 以查询代替临时变量操作将表达式抽取出来,放入一个方法并将其替代运用 程序调用的临时变量。基本原理是表达式可以运用于很多地方,并且消除临时变 量可以使其它的重构操作得以进行。以查询代替临时变量执行的前提条件: a ) 在临时变量的生命周期中,临时变量的值没有改变。 b ) 临时变量的表达式没有改变。 3 2 - 3 基于不变式的重构定位方法的特点 基于不变式的重构定位方法的优点: 采用d a i k o n 工具能动态的分析程序代码,不用依赖人的主观依赖识别代码。 基于不变式的重构定位方法的缺点: ( 1 ) 只能在程序执行的时使用,受程序的覆盖率影响,定位的结果不够精确。 ( 2 ) 没有考虑类之间的多重继承。 ( 3 ) 7 个不变式对代码缺陷的识别能力有限。 3 3 基于度量规则的重构定位方法 3 3 1 测距理论 f r a n ks i m o n 将内聚性度量引入到软件重构定位中。首先,用相似性来定义内 聚性。相似性表示为两个实体共有的属性集合。其次,为了定量分析相似性,用 相似度来描述内聚度。最后,定义了距离的概念来表示内聚度。以下给出距离的 相关定义【1 5 】【1 6 1 【1 7 】。 定义3 1 :相似度:如果两个实体中所有属性值相同,且c c a i ,则实体m , a 之间的相似度为: 删= 篇篙糊舯一胡酬艰辫础詹眭) 定义3 2 - 相似性度量:a m 是实体m 的属性集,a n 是实体n 的属性集,若 s c a m 且s o _ a n ,m 和n 之间的相似性表示为: s 砌伍= 鬣号三要爿其中,jq ) = 属性墨s h 是实体聊的属性) 第二章重构定位方法的研究上海师范大学硕士学位论文 定义3 3 :距离:两实体m ,n 之问的距离为: d i s t ( m 嘭= l s i m ( m 巾 从以上公式可得t ( 1 ) 实体间的距离越小,则相似度越大,实体间的内聚度越大; ( 2 ) 实体间的距离越大,则相似度越小,实体间的内聚度越小; ( 3 ) 当m = n 时,距离为0 ; ( 4 ) 当m 与n 不相关时,距离为1 ; ( 5 ) 0 d i s t 1 。 3 3 2 基于度量的重构定位方法 基于度量的重构定位方法【8 】主要用度量规则来量化软件的“坏味道”,从而识 别代码的“坏味道”,最后达到重构定位。s i m o n 的方法主题思想是【_ 7 】:将软件度 量和软件重构结合在一起,用基于内聚性的距离来量化代码中的“坏味道”,根据 度量结果来分析代码结构,从而识别到有缺陷的代码。并开发出重构定位的工具 v r m l w o r l db r o w s e ,该工具在三维空间内显示软件度量的结果。基于度量的重 构定位的方法可以分为三步: ( 1 ) 用距离的概念识别相关属性。 ( 2 ) 提出一个路径逻辑实例,这个实例可以应用有意义的重构。 ( 3 ) 将计算的实例距离构造一个直观的模型。运用特定s p r i n g 构架嵌入程 序,以虚拟实现建模语言( v r m l ) 生成3 d 模型,v r m l 可被任何v r m l 终端显示。 文中给出四类重构方法的定位具体过程:移动方法、属性以及抽取、内联类。以 移动方法为例。 移动方法是比较常见的重构方法。在识别“移动方法 重构中,使用距离概 念需要考虑成员f :b ,。对于一个方法f ,需要考虑方法的本身、所有直接调用的 方法和所有直接调用的属性;对于一个属性f ,需要考虑属性本身和所有调用它 的方法。计算两个实体之间的距离,需要结合两个实体的成员b f o 对于b 的定义 表明一个调用了很多其它类的属性并( 或) 方法对其它的成员具有短距离,而只 在某些地方才能调用定义了的方法或属性的方法对其它的成员具有长距离。以下 面两段代码为例。 上海师范大学硕士学位论文第三章重构定位方法的研究 c l a s sc l a s s _ a c l a s sc l a s sb p u b l i c :p u b l i c : s t a t i cv o i dm a l ( ) s t a t i cv o i dm b l0 a m = 0 :c l a s s _ a :a a 2 = 0 : m a 2 ( ) : m b 2o : ) m b 3o : s t a t i cv o i dm a 2 0 a a 2 = 0 :s t a t i cv o i dm b 2o a a l = 0 :c l a s s _ a :a a 2 = 0 : ) a b l = 0 : s t a t i cv o i dm a 3ol a a l = 0 :s t a t i cv o i dm b 30 a a 2 = 0 :c l a s s a :a a 2 = 0 : m a lo ; a b l = 0 : m a 2 ( ) :m b lo : s t a t i ci n ta a l :s t a t i ci n ta b l : s t a t i ci n ta a 2 : s t a r i ci n ta b 2 : ) ) 方法m b lo 的位置存在一个“坏味道”。因为m e t h o d b l0 只调用了a 类的成员, 没有使用自己类中的属性,所以选择使用“移动方法”的重构方法。为了自动化 识别“坏味道”,计算两个类中的所有成员之间的距离,如表3 2 所示。 t a b l e3 2t h ed i s t a n c em a t r i x 表3 - 2 距离矩阵 m a lo m a 2 ( )m a 3om b l ( )m b 2 ( )m b 3oa a la a 2a b la b 2 n 饵lo0 m a 2 ( )0 5o m a 3 ( ) 0 40 m b l ( ) 0 6o 60 50 m b 201 1 1 l0 m b 3 ( ) 1 1 1o 8 60 60 a a lo 50 6 70 3 30 510 8 8 0 a a 20 8 30 。60 50 6 710 8 6o 5o a b l11110 50 2 51l0 a b 2l1l10 3 3 o 6 11 0 7 5 0 上述提及的嵌入式s p r i n g 构架在e u c l i d e a n 空间上覆盖了1 0 个实体,从而 将计算的距离和显示距离对应起来。模拟情况以一种非常简单且易懂的方式建议 将方法m b lo 从c l a s s b 移动到c l a s s a 中。在移动方法的过程中,软件的功能 保持不变。 3 3 3 基于度量的重构定位方法特点 第三章重构定位方法的研究 上海师范人学硕十学位论文 基于度量的重构定位方法的优点: ( 1 ) 将软件重构和软件度量结合在起,度量结果能更客观地为软件重构定 位提供一个量化的依据; ( 2 ) 开发出的重构定位工具,采用了三维的空间来显示度量结果更直观。 基于度量的重构定位方法的缺点: ( 1 ) 只能静态的分析程序代码; ( 2 ) 识别代码缺陷的能力会因为度量的规则有差异。 ( 3 ) 没有考虑多态、异常和多线程的情况。 3 4 重构定位方法的比较分析 本文对三种重构定位方法进行分析,基于b a ds m e l l 方法、基于不变式方法 和基于度量方法对比如下表3 3 所示。 t a b l e3 - 3c o m p a r i s o na m o n gt h r e er e f a c t o r i n gl o c a l i z a t i o nm e t h o d s 表3 - 3 二种承构定位方法比较 方法名称基于b a ds m e l l基于不变式基丁度量 分析代码静态动态静态 执行代码的行数多少中 是否依赖人的主观判断是否否 自动化工具无 有有 3 5 本章小结 本章介绍了基于“坏味道”重构定位方法、基于不变式的重构定位方法和基 于度量的重构定位方法。详细介绍了三种方法的理论基础、方法的具体过程和分 析了三种方法的优缺点。通过分析,发现了现有重构定位方法的特点,特别是基 于度量的重构定位方法不能静态地分析程序和没有考虑多态的关系。本文下章将 引入切片来改进基于度量重构定位方法的不足。 1 4 上海师范大学硕士学位论文第四章面向对象动态分层切片 第四章面向对象动态分层切片 本章介绍了程序切片的相关知识,改进了传统的静态分层切片,提出的动态 分层切片为基于切片度量的重构定位方法做理论准备。 4 1 程序切片的基本概念 4 1 1 程序切片的定义 程序切片是一种程序分析的技术,主要分析程序语句以及语句之间的关系。 定义4 1 :程序切片是m a r kw e i s e r 首次提出的,必须满足两个条件【l7 j : ( 1 ) 程序切片和特定的切片准则一一对应,切片准则( v ,i ) 中的v 表示 在i 处定义或使用变量的集合,i 表示某个程序点( 一般为语句号) ; ( 2 ) 在程序p 和切片s 关于切片准则( v ,i ) 行为相同的前提下,程序p 的切片s 可以通过从p 中删除语句得到。 本文中,将定义中的第2 个条件中“行为”与重构定义中的“行为”等价。 即对程序切片删除与切片无关的语句前后,软件功能要保持不变。在保持行为不 变的前提下,程序切片通过删除与切片准则无关的语句大大减少分析程序的工作 量。因此程序切片可以应用到软件重构,特别是软件重构定位之中。 4 1 2 切片准则 由上节切片定义可知,程序切片会随着切片准则变化而变化,因此计算程序 切片时要考虑切片准则。目前使用比较多的切片准则有两种: ( 1 ) 静态切片准则 静态切片准则是一个二元组( n ,v ) ,其中n 是一个程序点( 一般是一条语 句) ,v 是一个变量集。 ( 2 ) 动态切片准则 动态切片准则是一个三元组( n ,v ,x ) ,其中n 是一个程序点( 一般是一条 语句) ,v 是一个变量集,x 是程序的输入。 4 2 程序切片分类 根据不同的标准可以将程序切片划分不同的种类,常见的种类如下: ( 1 ) 根据是否考虑程序输入划分:静态切片和动态切片【1 8 】【2 l 】 根据静态切片准则( n ,v ) ,静态切片表示删除与n 处v 中变量无关的语句和 谓词。保留下的语句和谓词构成了静态切片,都会影响n 处v 中的变量或者被其 影响。删除语句和谓词的前后,程序的功能保持不变。静态切片不考虑程序的输 入,所以执行时要覆盖所有可能的可达路径。切片的结果包含了所有与程序点变 量有关的所有语句,这些语句中有一些多余的语句,使得工作量比较大。 根据动态切片准则( n ,v ,x ) ,动态切片表示当程序输入x 时,删除与n 处 第四章面向对象动态分层切片上海师范人学硕十学位论文 变量无关的语句和谓词。构造动态切片前后,程序的功能也要保持不变。由于动 态切片限定了程序的输入情况,所以动念切片一般都比静态切片小,冗余的语句 较少,工作量要小。图4 1 中给出了一个程序的静态切片和动态切片实例,在图 中阴影部分表示删除的语句和谓词。 源程序代码切片准n 的静态切片切片准则 的动态切片 1v o i df ( i n t x )v o i df ( i n tx )v o i df ( i n tx ) 2 3 a i 3 :a 等3 :a 亍3 : 4b = 4 :b = 4 : 7 睁4 ; 5 i f ( x 1 0 、i f ( x l0 1i f ( x 1 0 1 6 7 c = a - t - 1 ; c = a 十1 ;c = a - i - l ; 8 9e l s ee l s ee l s e 1 0 i 、7 鼍 1 1b = a :b 5 a : 归西 1 2a _ 5 : a 芦5 ; a 一5 ; 1 3c = b :c = b : c = b ; 1 4 ) 15 p r i n t f ( “d ”,c ) ;p r i n t f ( “d ”,c ) ;p r i n t f ( “d

温馨提示

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

评论

0/150

提交评论