(计算机系统结构专业论文)重构中代码味道自动化检测技术的研究.pdf_第1页
(计算机系统结构专业论文)重构中代码味道自动化检测技术的研究.pdf_第2页
(计算机系统结构专业论文)重构中代码味道自动化检测技术的研究.pdf_第3页
(计算机系统结构专业论文)重构中代码味道自动化检测技术的研究.pdf_第4页
(计算机系统结构专业论文)重构中代码味道自动化检测技术的研究.pdf_第5页
已阅读5页,还剩62页未读 继续免费阅读

(计算机系统结构专业论文)重构中代码味道自动化检测技术的研究.pdf.pdf 免费下载

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

文档简介

上海大学硕士学位论文 望! ! 竺坚型! 坐! 堕翌! ! ! 竺型! ! ! 兰! ! 型 摘要 重构( r e f a c t o r i n g ) 是面向对象编程中改变软件内部结构而不改变其外在行 为的过程,是增强程序易理解性、稳健性,提高软件质量的重要手段,也是软件 遗留系统改造和软件重用的重要方法。软件重构过程中,找出软件的设计缺陷是 一个重要步骤,目前采用人工查找设计缺陷的方法既耗费时间且容易出错。采用 自动化的手段检测设计缺陷可以加快重构过程,避免在重构中引入原有缺陷。 代码味道( c o d es m e l l ) 是暗示代码中设计缺陷的警示信号,实际上已被程 序员看作程序中的设计缺陷,成为重构操作的具体对象。设计一个能自动检测代 码味道的工具具有实际意义。 论文工作主要有以下几个方面: 1 分析了代码味道的涵义、特征和引发原因,并且根据关注的角度和层次 将其分成类内部结构型、类内部行为型、类间结构型和类间行为型四类。 2 分析了检测前三类代码味道所需要完成的工作,详述了程序设计模型和 用l e p u s 形式化的代码味道。给出这三类代码味道的自动化检测方法:将源程 序提取成抽象的设计模型,检测所需要的信息都建立在设计模型之上,分别利用 代码度量、搜索显示和形式化比较来检测这三类代码味道。 3 结合j a v a 语言的特点,提出了设计模型和代码味道定义的正规文法,设 计了自动化检测工具的框架,说明了检测工具的设计结构、功能模块和相应的数 据结构,以及该检测工具的具体实现,给出了部分检测过程的运行实例。 关键词:重构、设计缺陷、代码味道、设计模型、形式化规则、l e p u s 、自动化 检测 箱i 页 匕海大学硕士学位论文 t h ep o s t g r a d u a t e t h e s i so f s h a n g h a i u n i v e r s i t y a b s t r a c t p r o g r a mr e s t r u c t u r i n gi nt h ec o n t e x to fo b j e c t e d - o r i e n t e dp r o g r a m m i n gi sk n o w n a sr e f a c t o r i n g i t sap r o c e s st oc h a n g et h ei n t e r n a ls t r u c t u r eo fs o f t w a r ew h i l e p r e s e r v i n gt h ee x t e r n a lb e h a v i o r r e f a e t o r i n gc a nm a k es o f t w a r ec o m p r e h e n s i v e 、 r o b u s ta n di m p r o v ei t sq u a l i t y , m e a n w h i l e ,i ti sak e ym e a n st ot r a n s f o r mt h el e g a c y s y s t e ma n df o rs o f t w a r er e u s e t h ed e t e c t i o no fs o f t w a r ed e s i g nd e f e c t si sav e r y i m p o r t a n ts t e pi ns o f t w a r er e f a c t o r i n gp r o c e s s r e c e n t l y , p e o p l eo f t e nd e t e c td e f e c t s m a n u a l l y ,i ts e e m st i m ec o n s u m ea n de r r o r - p r o n e ,s oa u t o m a t i cd e t e c t i o nb yu s i n g t o o l si sab e t t e rw a y a u t o m a t i c a l l yd e t e c t i n gd e s i g nd e f e c t sc a ns p e e du pr e f a c t o r i n g p r o c e s sa n da v o i db r i n g i n gp r i m a r yd e f e c t st on e w v e r s i o n c o d es m e l l sr e v e a lt h ed e s i g nd e f e c ti np r o g r a m i ti su s e da st h ep r a c t i c a l s t a n d a r df o rp r o g r a m m e rt oe s t i m a t es o f t w a r ed e s i g nd e f e c t t od e s i g nat o o lt o s u p p o r tt h ed e t e c t i o no fc o d es m e l l sc a np r o v i d ew i t hm u c hp r a c t i c a lm e a n i n g m a i nc o n t r i b u t i o n si nt h i st h e s i sa r e : 1 t h r o u g ha n a l y s i so fc h a r a c t e r i s t i c so fc o d es m e l l s ,t h em e a n i n gt h e ys t a n d sa n d t h ef a c t o r st h a ti n d u c e dt h e m ,t h i sp a p e rp r o p o s e st a x o n o m yf o rc o d es m e l l s , n a m e l yt h ei n t r a - c l a s s e ss t r u c t u r et y p e ,i n t r a - c l a s s e sb e h a v i o rt y p e ,i n t e r c l a s s e s s t r u c t u r et y p ea n di n t e r - c l a s s e sb e h a v i o rt y p e 2a u t o m a t i cm e t h o d st od e t e c tt h et h r e eo ff o r e g o i n gd i f f e r e n tt y p e so f c o d es m e l l s a r ep r o p o s e d s p e c i a l l y , t h ed e s i g nm o d e la n df o r m a le x p r e s s i o no fi n t e r - c l a s s e s s t r u c t u r et y p ei nl e p u sa r ed e s c r i b e di nd e t a i l b a s e do nt h a t ,t h et h r e et y p e sa r e d e t e c t e dr e s p e c t i v e l yb yu s i n gc o d em e t r i c s ,s e a r c ha n dd i s p l a y , a n df o r m a l i z e d c o m p a r i s o n 3 m a t c h i n gt h ef e a t u r e so fj a v a ,t h ef o r m a lg r a m m a ro fd e s i g np a t t e r na n dc o d e s m e l ld e f i n i t i o n sa r ei n v e s t i g a t e d i ns u c c e s s i o n ,af r a m e w o r ko fa u t o m a t i cd e t e c t t o o li sd e s i g n e d ;i t ss t r u c t u r e ,f u n c t i o nm o d u l e ,a n dc o r r e s p o n d i n gd a t as t r u c t u r e a r ee x p l a i n e d f i n a l l y , t h ei m p l e m e n t a t i o na n dp a r to fr u n n i n ge x a m p l e sa r e j n t r o d u c e d k e yw o r d s :r e f a c t o r i n g ,d e s i g nd e f e c t ,c o d es m e l l s ,d e s i g nm o d e l ,f o r m a lr o l e s , l e p u s ,a u t o m a t i cd e t e c t i o n 第1 1 页 原创性声明 本人声明:所呈交的论文是本人在导师指导下进行的研究工作。 除了文中特别加以标注和致谢的地方外,论文中不包含其他人已发表 或撰写过的研究成果。参与同一工作的其他同志对本研究所做的任何 贡献均已在论文中作了明确的说明并表示了谢意。 签名:z 堑岔日期兰兰:! :, 本论文使用授权说明 本人完全了解上海大学有关保留、使用学位论文的规定,即:学校有权保留 论文及送交论文复印件,允许论文被查阅和借阅;学校可以公布论文的全部或部 分内容。 ( 保密的论文在解密后应遵守此规定) 丝吼型尘 l 二晦大学硕士学位论文 t h ep o s t g r a d u a t e t h e s i so f s h a n g h a iu n i v e r s i t y 1 1 研究的意义 第一章绪论 软件在其漫长的生命周期内,需要像自然物种的进化一样适应变化。在初期 开发中,由于需求的逐步明确和不断改变,需要不断修改软件系统。软件产品投 入使用后,仍然需要改正一些错误。随着工作环境的变化、新需求的提出,或者 进行升级,也需要不断修改软件系统。 对软件修改工作的逐渐重视和深入研究,演化出了重构也丑。自从重构的概 念提出以来,越来越多的人开始认识到它的重要性,特别是在面向对象的领域, 越来越多的人开始从各个方面对它进行研究。重构逐渐成为软件开发和维护中克 服原有缺陷、提升可扩展性的一个重要手段。 软件开发中时问和经费的限制使原有设计本身存在缺陷,而在重构过程中, 由于程序员对已有系统认识不足,或者没有发现缺陷等原因,重构让软件的体系 结构越来越不符合原来的设计,使得现有的软件变得“脆弱”,因而迅速老化。 正如f r e d b r o o k s 所说,“所有的修改都将毁坏整个程序的体系结构,越来越少的 修改是针对原有设计的,而越来越多的是针对先前修改所留下的缺陷”盥。 如果能明确地告诉程序员哪里有缺陷( 需要重构什么) ,怎样修正缺陷( 采 用什么方法重构和怎样重构) ,这将在节省时间的同时,也减少重构带来的新缺 陷。尤其对于普遍存在的那些先凭借自己的直觉、经验和运气发现程序设计缺陷 所谓的代码昧道( c o d es m e l l s ) 性赳,从而才进行重构的程序员,能为他们 提供一个自动检测程序缺陷的工具将十分有意义。 1 2 研究的动机和目的 重构是如此的重要,但是到目前为止,还没有一个集成的开发环境能够完全 支持重构的各个步骤,大多数的开发环境对重构的支持都局限在具体的重构操作 上,例如,他们列出了若干重构方法,当程序员选中某段代码并选择某个重构方 法,就可以自动的执行这个重构方法。虽然说这一步可以帮助程序员解决手工重 构易出错的困难,但仍然需要手工检测程序到底具有怎样的缺陷并找出解决缺陷 第1 页 上海大学硕士学位论文 ! 生! 坚堑! ! ! 坐旦! ! ! ! 堕! ! 竺g 坠坐! ! 塑塑 的方法。用手工完成以e 两步是相当麻烦的,事实上比完成第三步更加困难。表 现在如下几个方面: ( 1 ) 目前开发工具只支持一个局部的视图,程序员很难一目了然地看清楚整个工 程的体系结构;同时,需求和功能的经常变化使得设计和代码脱节,程序员要我 出增加或修改的代码非常困难,特别是查找别人的代码。但现阶段的环境却没有 一个能提供整体的动态查询,比如,查询某个类或方法引用了某个实例变量。这 样使得手工找出缺陷是很困难的。 ( 2 ) 一般的程序员无法准确判断某个缺陷究竟属于何种缺陷,这直接影响了所选 重构方法的针对性。 ( 3 ) 手工查找耗费大量的时间。 因此,查找软件缺陷作为重构的一个重要步骤显得特别重要。鉴于以上原因, 本文试图提供一个辅助的工具帮助程序员查找软件中的设计缺陷,以体现重构在 研究和实际应用上的重要性。 由于目前大家把代码味道作为认识缺陷的标准,因此本文的检测工具也针对 代码味道。但由于代码味道是一个广泛的概念,无法用单一的方法进行检测。因 此本文从代码味道的分析入手,按照代码味道所处的层次以及各自的特征将其分 成四类,并针对其中三类味道给予不同的检测方法:对可以在数量上进行判断的 代码味道,将采用代码度量方法检测;对某些语义上相关的代码味道,则提供查 询检索功能,作为程序员自己判断的基础;对类间结构型的代码味道的检测,将 采用形式化的检测方法。特别地,类间结构型代码味道的检测将作为研究的重点, 本文对该类代码味道的形式化检测原理和设计做了详细阐述。 1 3 本文的主要内容与组织结构 本文首先介绍了重构的概念和重构的步骤,并指出各个步骤中目前的研究成 果。揭示了实施重构中需要手工检测程序缺陷不易的问题。阐述了一类特殊的设 计缺陷一一代码味道的研究现状和m a r t i nf o w l e r 等提出的各类代码味道的涵义 及引发这些代码味道的原因,并以此为基础分析了它的特征,根据关注代码味道 的不同的角度和层次将其分成类内部结构型、类内部行为型、类间结构型和类间 行为型四类。分析了检测前三类代码味道所需要完成的工作,详述了程序设计模 第2 页 每大学坝十学位论又 旦! ! ! ! ! 墅! ! ! 坐! ! ! ! ! ! ! ! ! 竺g 堕! ! ! ! ! ! 堡 型和采用l e p u s 形式化代码味道。分别给出这三类代码味道的自动化检测方法: 将源程序提取成抽象的设计模型,检测所需要的信息都建立在设计模型之上:分 别利用代码度量、搜索显示和形式化比较来检测这三类味道。说明了检测工具的 设计结构、功能模块和相应的数据结构,以及该检测工具的具体实现,给出了部 分检测过程的运行实例。 全文由以下六章组成。第一章,讲述了本课题的研究意义,提出了本课题的 研究目标和方向。第二章介绍了重构、设计缺陷和一类特殊的设计缺陷一一代码 味道的相关概念以及它们的研究现状,同时介绍了形式化语言l e p u s ,以此作 为自动化检测其中一类代码味道的基础。第三章,对代码味道的特征进行了分析, 在此基础上对代码味道进行分类。并针对各种不同的代码味道,阐述了代码味道 检测的基本理论。第四章提出了检测工具的设计原型,详细说明了工具的设计。 第五章,介绍了该工具的实现过程,并介绍了检测的实例。第六章总结全文,并 展望了今后需做的工作。 篇3 页 l 海大学顺l 学位论文 :望! ! ! 塑! 型! 坐卫! 竺! ! ! ! 竺堕坐! ! ! ! ! 堕 第二章相关概念及研究现状 2 1 重构 2 1 1 什么是重构 为了适应需求的改变或者软件生存环境的变化,软件也在不断变化。有时这 些改变并不影响软件的行为,而仅仅改变了软件的内部结构。例如,一个程序员 可能会改变函数的名称,或者用一个函数来代替重复的代码,或者改变函数的接 口参数以使得函数更容易复用。具有行为保持( b e h a v i o r p r e s e r v i n g ) 性的代码修改 过程通常被统称为重构。 对于重构的定义,并没有一个统一的表述。重构实际上对应英文中两个单词: r e s t r u c t u r i n g 和r e f a c t o r i n g 。r e s t r u c t u r i n g 的定义如下:在同一个相对抽象的层 次上,把一种形式转换成另外一种形式,但同时要保持该对象的外在行为( 功能 和语义) 【1 l 。这种转换通常来说都是外表上的,比如从程序设计结构的角度变换 代码形式;这种转换也不一定是为了新的需求而做修改,有时它只是为了让程序 变得容易理解。r e f a c t o r i n g 首次出现在o p d y k e 的博士论文中心。r e f a c t o f i n g 实 际上是r e s t r u c t u r i n g 应用在面向对象软件中的个变体,其定义如下:r e f a c t o r i n g 是对面向对象语言编写的软件进行改变的一个过程,该过程能增强软件的内部结 构,但不改变该软件的外部行为凹。现在所说的重构是r e s t r u c t u r i n g 和r e f a c t o r i n g 的统称,但实际上更侧重于r e f a c t o r i n g 。 文献盥占姐把重构的定义分为两种形式:名词形式和动词形式。按名词形式, 重构是为了达到使软件更容易理解和更容易修改的目标,在不改变软件可观察行 为的前提下对软件内部结构的一种改变。按动词形式,重构是在不改变软件可观 察行为的前提下应用一系列的重构技术重新构建软件的过程。 软件结构的改变可能出于各种各样的目的,如进行打印美化、性能优化等。 但是,只有山于增强可理解性、可修改性和可维护性的改变才+ 是重构,这种改变 必须保持软件的可观察行为。按照o p d y k e 和m a r t i nf o w l e r 的观点,软件重构之 前实现什么功能,重构之后照样实现这些功能必。 第4 页 匕海大学硕士学位论文 堡! ! ! ! 墅型! 坐塑! ! ! 堕! 坠! g 堕坐! ! ! ! 堕 2 1 2 重构的步骤 重构的整个过程可以划分为如下几个步骤叫: f 1 ) 确定重构对象,根据重构对象内容决定重构方法( r e f a c t o r i n g s ) ; f 2 ) 确保重构方法能保持软件行为; f 3 ) 实行重构操作; ( 4 ) 评价重构对软件质量和软件结构带来的影响; f 5 1 保持重构程序代码与其它对象( 文档,需求分析,测试用例) 的一致性。 ( 1 ) 找出重构对象 决定一个合适的抽象层次去实施重构操作是第一步,比如,是决定对程序, 还是对设计框架或是对需求文档进行重构,等等。 通常,决定重构对象并确定重构方法两者结合成为一个新的研究领域。比如, k a t a o k a 等实现了一个工具d a i k o n ,该工具通过自动地检测程序不变量来决定重 构中需要采用什么重构方法刨。 现在最广泛的检测方法是查找程序的坏味道( b a ds m e l l s ) 。k e n t b e c k 用坏 味道比喻糟糕的设计和程序。比如:重复的代码( d u p l i c a t e dc o d e ) ,过长函数 ( l o n g m e t h o d ) ,过大类( l a r g e c l a s s ) 等等。至于怎样找出这些坏味道,k e n t b e c k 认为程序员的直觉、经验和灵感可能比其它方法更有效必。t o u r w e n m e n s 采用 一种基于逻辑元程序( l m p ) 的形式化方法半自动化地标识几种特定的坏味道,并 指出用什么方法消除这些坏味道删。 ( 2 ) 确保重构方法能保持软件行为 首先需要搞清楚一点就是什么是行为保持。o p i d y k e 给出最原始的定义是: 对应一组输入数据,软件重构后能得到重构前同样的输出,就称为具有行为保持 功能心。在许多应用领域中,仅仅保持输入输出行为是不够的。例如在实时软件 中,重构应该保持执行时间短的特性;在嵌入式系统中,重构应该遵循内存的约 束。 要确保重构方法能保持软件行为,通用的方法是考虑狭义的行为,用一组测 试用例,来检测输出是否相同。更精确的方法是用形式化方法检查是否保持语义 特性。例如,r o b e , s 集中讨论重构方法的前置条件( p r e c o n d i t i o n s ) 和后置 ( p o s t c o n d i t i o n s ) 条件,前置条件和后置条件确保重构方法具有行为保持特性, 第5 页 上海大学硕士学位论文 堡! ! ! ! 墅型! 坐里! 兰堕! ! 塑g ! ! ! ! ! ! ! ! ! ! 堡 而不是程序转换本身1 刖。 ( 3 ) 重构操作 到底怎样完成重构操作呢? 对这方面的研究很多,支持完成该步骤的工具也 很多。m a r t i n f o w l e r 根据平时的经验提出了很多重构方法心,他把坏味道与重构 方法联系起来,有什么样的坏味道,就采用什么样的方法。k a t s u h i s am a r u y a m a 采用基于块划分的自动化工具提取方法,他把具有相似行为的程序代码划分成一 个块,根据可达块和管理块来提取具有特定变量的方法山。 通常情况下是把行为保持和重构放在一起的。例如,在现在用得较广泛的重 构浏览器毋e f a c t o 渤gb r o w s e r ) 这个工具叫里有很多菜单选项,每个选项对应一种 重构方法,而且每种方法都具有行为保持的功能。 其它一些支持重构操作的方法是:图形转换,形式化程序方法,程序划分, 软件可视化,动态程序分析,等等。 ( 4 ) 评价重构给软件带来的影响 采用重构方法重构软件,都有其自身的目的。例如,消除代码的冗余性,提 高抽象程度,加强软件的可复用性等。许多相关的技术用来评价重构后带来的影 响,如统计方法、软件量度等。例如,k a t a o k a 等采用耦合度来评估重构对可维 护性带来的影响埘。 ( 5 ) 保持重构后的一致性 软件开发包括一系列的对象,比如需求说明、架构、源代码、文档和测试套 件( t e s ts u i t e s ) 等。对于如何保持这些对象之间一致性的问题,g r e gb u t l e r 等提出 了框架的级联式重构,采用级联的路线图,来保持框架的各个组成部分之间的一 致性删。 2 2 设计缺陷及其检测 软件系统( 或子系统) 中,预示了开发人员需要为之改变的部分称为设计缺 陷。换句话说,一个开发人员在开发的某个阶段意识到某种缺陷,是因为他( 她) 发现原来的系统难以适应将来的修改或添加新功能,必须对它做出改变必。 第6 页 上海大学硕j 学位论文 ! 生! ! ! e ! 型! 坐! ! ! ! ! ! ! ! ! ! 竺g ! ! ! ! ! ! ! ! ! ! 堡 2 2 1 设计缺陷检测 要避免设计缺陷,最好的方法,就是在设计前确保所有的设计都是最优化的, 但是任何一个开发人员,都不可能对所有的领域、需求或软件都非常熟悉。就算 能确保当时的设计没有什么缺陷,经过若干年后,也会发现原来的软件根本不符 合当前的设计要求。所以发现设计缺陷并修改设计缺陷是一个在所难免的过程。 而拥有一定的检测方法或检测工具作为该过程实施的手段是相当重要的。 有多种方法检测设计缺陷,一般来说,可以分为静态分析和动念分析u 5 1 。另 外种划分方法是分为自动化检测和手工检测。 2 2 2 静态分析 静态程序分析( 简称静态分析) 检测程序的源代码或软件系统的可执行的映 像,检测过程中不需要软件系统处于运行状态,一个没有完成或不可执行的程序 也可以用该方法分析。根据所采用的分析技术,又可分为数量分析和质量分析。 ( 1 ) 数量分析 数量分析,又称为代码度量,是检测源程序中某些特定信息的数量,程序的 质量取决于被检测特性的数量大小。一些最基本的程序特性将作为度量的对象, 比如某个工程中类的数量多少或者是程序代码的行数( l i n eo f c o d e ,l o c ) 。检 测的结果作为直接衡量的准则,或者作为更复杂衡量手段中的基本元素。 虽然目前定义了许多代码度量的对象,但实际上只有少数几种真正被用到。 原因可能是由于,度量出来的这些数据到底具有什么真正的含义无法被数学或者 被统计方法证明。同时,也只有少数几种度量的对象能被度量工具实现,最典型 的可能是如下几种: 程序代码行数或者用千行数( k l o c ) 描述,计算中除去注释行和空行; 方法数目的权重( w e i g h t e d m e t h o d p e rc l a s s ,w m c ) ,计算一个类中方法 数目占所有类方法总和的比率; 继承层次的深度( d e p t ho f i n h e r i t a n c et r e e ,d i t ) ,计算系统中某个类的 最大继承深度数。 ( 2 ) 质量分析 第7 页 上海大学硕士学位论文 ! 坠! ! ! 堕型! 竺! 望! 兰堕! ! 竺! ! ! 旦! ! ! ! ! ! ! 生 质量分析是用预定义的规则,检测系统或子系统中是否存在错误或者某种 特定的结构特征。目前质量分析主要用来检测程序中的代码错误或类型错误。例 如,j a v a 语言中的操作符“= = ”和“e q u a l s ( ) ”函数都用来比较对象是否相等,前者 用来判断两个对象是不是同一个,后者用来比较两个对象的值是否相等,比如: s t r i n gsl = ”t e s t ”; s t r i n gs 2 - = r a e ws t r i n g ( ”t e s t ”) ; b o o l e a nf l a g l = n a 9 2 = f a l s e ; i f ( s l = = s 2 ) f f l a g l = t r u e ; i f ( s 1 e q u a l s ( s 2 ) f l a 9 2 = t r u e ;) ) 由于s l 和s 2 是两个不同的对象,所以用“= = ”,比较结果则不等,而用e q u a l s 比较则相等。上例中f l a g l 将等于f a l s e ,而f l a 9 2 等于t r u e 。如果程序员意在比较 两个对象的值是否相等,而错误地采用了“= = ”,质量静态分析工具则会通过对 整个程序的搜索找出这些错误。 2 2 3 动态分析 动态程序分析( 简称动态分析) 方法在运行时检测程序的行为。在可运行的 前提下,程序在运行时环境中被检测。程序员可以编写若干测试用例分别对应程 序的功能特性,功能特性涵盖越广,检测就越全面。动态分析对检测程序结构的 缺陷是很有效的,但只局限于可检测的运行模式。比如检测某些方法的参数是否 用到,或者检测某些类的对象是否仅作为过渡对象使用等等。 2 2 4 手工和自动化的检测 程序分析可以通过手工方法和自动化工具实施。手工方法要求程序员有相当 的经验;自动化的工具通过工具实现,一般需要程序员了解如何操作工具。 数量分析一般检测的对象相对规整,而且手工操作不易,所以一般都采用自 动化的工具实现。比如统计一个工程总共有多少行代码,小的工程还可以人工计 第8 页 上海大学硕士学位论文 翌! ! 坚坚! ! ! 坐旦竺! 堕! ! ! ! ! ! ! ! 塑! 竺堡 算,但像i b m 3 6 0 这样大型的系统,根本无法人工计算。 质量分析可以由手工和自动化两种手段实施。通常,程序员在代码编写过程 中和代码复审过程中都要反复用到手工分析方法来仔细检测程序的错误和缺陷。 虽然手工方法是程序员经常用到的有效方法,但是手工方法耗费时间多,而且容 易出错。相比之下,工具分析更为有效,比如经典的工具l i n t ,起初是为规范c 语言格式设计的,后来逐步进化成为c + + 和j a v a 语言的质量检测工具。 自动化检测利用了程序分析方法,主要是利用静态分析。另外一种方法就是 把程序的结构变成可视化系统,这种技术不提供完整的自动化检测,只是对程序 提供种辅助手段。下面介绍几类自动化的检测工具。 ( i ) 代码度量工具 代码度量用来判定程序某些特有的属性,这种方法一般先把源程序转换成一 种中间形式,比如抽象的语法树( a b s t r a c ts y n t a c t i ct r e e ,a s t ) ,然后在中间形 式基础j 二分析特定范围内的程序的某个属性。一般先对每个特殊的属性都定义一 个闽值,如果某些被检测的属性超过了该阈值,工具就自动输出这些属性的特征。 根据这些特征,程序员可以作进一步判断。 ( 2 ) 可视化分析工具 可视化分析工具通过可视化方法把程序的整体结构展现出来,在面向对象的 设计中,一般会用不同的图像( 图形) 表示不同的对象。比如用u m l 图中的静 态图描述程序的静态结构。 可视化的工具并不显式地描述系统的设计缺陷,最终需要开发人员仔细地浏 览或体会。对小型的系统,可视化的工具对开发人员很有帮助,但大型系统不仅 需要特别有经验的开发人员,而且极其耗费时间。 ( 3 ) 特殊功能分析工具 这种工具通常采用质量静态分析方法,首先也需要将程序转换成一种中间形 式,并且预定义一些规则组合来描述某种特定的缺陷,然后直接或间接地在中间 形式的基础上自动验证是否符合这些规则。由于规则组合针对一类特定的设计缺 陷,该方法对检测系统的某类同性质的设计缺陷非常有效。一般来说,对功能的 抽象层次越高,就越容易检测,比如把设计模式作为一个特殊功能,并用l a y o u t , c o n s t r a i n t ,l e p u s 等m j 进行抽象。 第9 页 上海大学硕士学位论文 t h ep o s t g r a d u a t et h e s i so f s h a n g h a iu n i v e r s i t y 2 3 代码味道研究的现状 上面介绍了设计缺陷和设计缺陷自动化检测的手段与工具。然而什么样的设 计缺陷更适宜用自动化的手段去检测呢? 这就是代码味道。代码味道( 就是前面 所说的坏味道) 是代码中暗示设计缺陷的警示信号,是重构操作的具体对象。 k e n tb e c k 和m a r t i nf o w l e r 通过研究代码味道给出的一些迹象,来判断重构的时 机幽,这些代码味道可以用来标识哪些程序具有怎样的缺陷,同时m a r t i nf o w l e r 为这些代码味道给出了相应的重构方法,代码味道已成为程序员判断并检测缺陷 的实际标准。 目前对代码味道的研究主要是针对不同代码味道的寻找和对代码味道性质 的研究。 m a r t i nf o w l e r 和k e n tb e c k 根据自身的经验提出了2 2 种代码味道心,代码味 道的寻找还处在一个不断完善的过程中,目前m a r t i nf o w l e r 组织了一个关于重 构的超文本百科全书( r e f a c t o r i n g w n i ) ,有经验的程序员可以根据自身的经验 把一些缺陷添加到这个w i k i 中,大家共同对这些加入的味道进行审核,这样丰 富了代码味道的种类嘲。 另外一些研究就是根据这些代码味道,提出相应的重构方法。重构方法就是 怎样进行重构的方法,其概念早在上世纪9 0 年代就已经提出来了叫,以前对重 构方法的研究主要是解决重构方法的前置条件和后置条件上。趔。直到m a r t i n f o w l e r 提出代码味道的概念后,才逐步把代码味道与重构方法结合起来,个代 码对应多种重构方法,只要程序员意识到一种代码味道,他( 她) 就可以根据重 构方法进行重构,不需要自己去研究怎样处理这种味道了出划上上2 j 。 为了找出代码味道各自的特征或它们之间的联系,不少人试图对代码味道进 行分类研究。m a r t i n f l o w e r 等采用自然语言或u m l 图对代码味道进行了说明, 同时把代码味道分为两类,即,类内部和类之间的代码味道凹,这种分类方法侧 重于描述代码的聚类与耦合 1 8 1 。e m d e n 等将代码味道分成原始的和演化的两个 类别,用来区分代码味道的复杂程度叫。m a n t y l a 等通过大量实验,从程序员主 观认识代码味道的角度,将代码味道分为7 类,同时作者从问卷调查入手分析了 这7 类代码味道内部、之间的联系强度,并以此为基础分析了代码度量和程序员 主观评估之间的关系避纠。 第10 页 上海大学硕士学位论文 ! 些! ! 壁g ! 苎璺! 坐旦竺堕! 皇竺g ! ! ! 旦! ! :竺坐 一直以来,m a r t i n f o w l e r 等认为,代码味道并不能作为一个严格的判断哪里 需要重构的标准,相反,他们认为程序员的意识将会更加有效隘】:“从我们的经 验来看,没有任何一种量度规矩比得上一个见识广博者的直觉。你必须培养自己 的判断力,学会判断一个c l a s s 中有多少i n s t a n c e 变量算是太大、一个函数内有 多少行代码才算太长。”因此,代码味道的自动检测虽然很有意义,但是目前公 开发表的研究成果为数不多。m e n s 等采用逻辑元语言分析程序中的代码味道圳, 给出了三种特殊的代码味道的解决方案,但此方法要求查找这三类味道时要自己 写搜索语句,这种搜索语句很像s q l ,可以嵌套多层,一个程序员在非常熟悉 这三种代码味道的情况下,严格地书写这三种代码味道的关系,就可以在整个工 程中查找到底有没有某种味道;e m d e n 等试图给出一种通用的检测代码味道的方 案,通过分析程序代码生成抽象语法树,并用图形化的方式展现出来【圳,但该方 法并不能自动辨认代码味道,仍然需要程序员凭经验辨认何处存在代码味道。 虽然m a r t i nf l o w e r 等认为人的思维至上,但是m a n t y l a 等试图解释,m a r t i n f l o w e r 的观点与软件设计的质量可以用代码或设计度量来衡量的观点并不是相 抵触的凹。本文综合这两种观点,既承认程序员意识的决定作用,又不忽视代码 或设计度量的重要作用,因此提出实现一个自动化检测工具,能借助代码咪道这 一实际应用的标准,在程序员的实际开发和重构中起到良好的辅助作用。另外, 由于代码味道涉及范围广泛,起因各异,这个工具并不打算把所有的代码味道全 部纳入自动化检测的范围之内。 2 4 代码味道的形式化 如前所述,要检测程序的代码味道,仅仅用程序度量进行数量上的分析并不 能解决问题,而可视化的方法并不是真正意义上的自动化检测。有很多代码味道 需要进行推理和比较才能找出,比如“被拒绝的馈赠”中需要查找父类中的多个 方法是否在于类中用到,又比如“不合理的接口”需要查找在大多数子类中存在 而在父类中不存在的方法,等等。必须采用特殊功能的工具才能完成对这些代码 味道的自动化检测。特殊功能工具的实现需要具有强有力的描述和推理功能,因 此本文将借助于形式化语言作为部分特殊代码味道的描述和推理的手段。 第1 i 页 上海大学硕:l 学位论文 t h ep o s t g r a d u a t e t h e s i so f s h a n g h a iu n i v e r s i t y 2 4 1 形式化语言简要比较 目前有许多形式化的语言,比如用来对设计模式进行形式化的语言 l a y o m 匿习、r a g s 盥j 、s p i n e2 t 嘶ud i s c o 圆等,另外有面向模型的形式化规格说 明语言z l 2 _ o 、v d m 和o b j e c tz ,通过代数方法描述软件系统规格说明的语言 l a r c h 幽等。在上述语言中,l a l y o m 虽然能处理类之间一些简单的关系,但不能 处理实体集合之间的关系;r a g s 和s p i n e 都是针对具体的设计模式而设定的, 而且s p i n e 是只针对j a v a 语言的具体模式语言,不利于移植到其它的语言上; d i s c o 同样不能处理集合之间的关系,且不能用结构描述一个模式。z 语言基于 谓词逻辑,有很强的推理功能,但并不是针对面向对象特殊的实体和实体关系的: 而用代数方法描述规格说明的语言也不便描述面向对象的实体和实体关系。 l e p u s l 2 8 i 作为一种形式化语言,具有很好的描述面向对象设计和体系结构的 能力,同时又具有很好的语法结构和高层次上语义表示能力,对于面向对象软件 中的各种实体和实体关系都有明确的表示,l e p u s 是一个很好的描述代码味道 的语言。 2 4 2l e p u s 语言 l e p u s ( l a n g u a g ef o rp a t t e r n su n i f o r ms p e c i f i c a t i o n ,模式统一描述语言) 是 用于描述面向对象设计和体系结构的形式化规格说明语言。l e p u s 不仅具有良 好的语义,而且已经形成了一个用于面向对象设计和体系结构表示的本体 ( o n t o l o g y ) ,本工具中选用它作为系统的基础。 一个l e p u s 规格说明由以下几个部分组成: ( 1 ) 规格变量和常量,总称为项,每个项都有其定义域; ( 2 ) 规格项之问关系的约束,称之为基础谓词: ( 3 ) 泛化谓词,用于解释关系和集合的属性。 其中,基础谓词和泛化谓词统称为谓词。总的来说,谓词用于表示规格项之 间的关系,下面简要介绍各个部分。 ( 一) l e p u s 中的项 在l e p u s 中使用项来表示实体,每个项都有各自的定义域,定义域包括三 第1 2 页 上海人学硕士学位论文 里! ! ! 韭! 型! 坐翌型! ! ! ! ! ! 些! ! ! 旦! ! :! ! ! 堕 个集合:类的集合( c ) 、函数的集合( f ) 、签名的集合以及层次的集合( h ) ( i t 是一个类集合,其中有一个是根类,其它类直接或间接的继承于它) 。 由于l e p u s 是一个高阶的系统,因而其中的集合有其集合维度。假设s 是 一个集合,用s :,s ? ,s :表示集合s 中的元素,s :,s :,s :表示s 的子集, 或者说是p ( s ) 的元素。般来说,变量j ? 表示p m ( s ) 的成员,其中m e n ,h e n 。 其中n 表示 0 ,l ,2 ,) 的包括0 的自然数集合。p ( s ) 表示集合s 的幂集,并 且有p 0 ( s ) = s 。 l e p u s 将一个变量的上标定义为它的维,s o 表示0 维对象,当d 0 时,一 表示一个d - 1 维的对象集合。 ol e p u s 的谓词 l e p u s 谓词分为两种,一是基础谓词,一是泛化谓词。 ( 1 ) 基础谓词 l e p u s 中的基础谓词是对项的约束,它定义了元素变量的关系,关系包括 一元关系和二元关系,一元关系用于表示单个项所满足的属性,二元关系用于约 束两个项所满足的属性,它们的语义都是直观的。 ( 2 ) 泛化谓词 泛化谓词用于解释关系和集合的属性,下面给出几个泛化谓词的定义。 定义i 如果口是一个关系,矿和矽是元素或集合,则谓词t o t a l ( 用单箭 头一表示) 定义如下: 卢一( 矿,阡 三v v v 3 r w 阡- ( ,0 定义如果日是一个关系,矿和矿是元素或集合,则谓词i s o m o r p h i c ( 用 双箭头一表示) 定义如下: p h ( 矿,r e ) 兰v v v 31 w f n 卢( v ,w ) v w 网! v y :( v ,w ) 其中,刊表明它所饰的变量是具有唯一性的。 函数家族和部落 l e p u s 中有两个特殊的谓词用于表示函数的属性,即家族和部落1 2 2 1 。 家族用于描述多个类中特别是一个类层次变量中具有相同型构( s i g n a t u r e 又名签名、标记等,相当于函数原型) 的函数群。 第1 3 页 上海大学坝士学位论文 望! ! ! ! 塑! 塑! 坐! ! 型! ! ! ! ! 塑塑! ! ! ! ! ! ! ! 生 部落是同构家族的集合。 定义关系c l a n f 4 c 4 定义如下: c l a n ( f 4 ,c 4 ) 三d e f i n e d l n + + ( f “,c 4 ) ( v 只扣,碍- 1 f 4 :s a m e s i g n a t u r e ( e 水1 ,掣。1 ) ) ( d o ) 其中,定义中的d e f i n e d l n 是指“定义于”,s a m e s i g n a t u e 表示两个函数型 构相同。上例表示,一个方法集在一个类集中定义,而该方法集中的所有方法是 型构相同的,这样的一个方法集就称为一个家族。 定义关系t r i b e f “1xc 4 定义如下: t r i b e ( f “,c 4 ) ;v f 4 f “:c l a n ( f 4 ,c 4 ) ( d 0 ) t r i b e ( f “1 ,c 。) ;c l a n ( f ,c ) d e f i n e d l n ( ,c ) ( d - - 0 ) 定义v 对于给定的方法p 和一组类c 。,表达式p o c “的定义如下( 其中 表示选择算子) : d = o 时, f f e p d e f i n e d l n ( 厂,c 。) ) d 0 时, p 圆c “1 c “、c “) 根据以上定义,如果给定一个方法集p 和一组类c 4 ,那么p 圆c “的定义如 下: p o c 。; f 。l p o c 4a p p l e p u s 语言作为一种描述面向对象的语言,具有简洁性、语义语法的完备 性和通用性

温馨提示

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

评论

0/150

提交评论