(计算机软件与理论专业论文)反模式refactoring自动化解决方案研究.pdf_第1页
(计算机软件与理论专业论文)反模式refactoring自动化解决方案研究.pdf_第2页
(计算机软件与理论专业论文)反模式refactoring自动化解决方案研究.pdf_第3页
(计算机软件与理论专业论文)反模式refactoring自动化解决方案研究.pdf_第4页
(计算机软件与理论专业论文)反模式refactoring自动化解决方案研究.pdf_第5页
已阅读5页,还剩75页未读 继续免费阅读

(计算机软件与理论专业论文)反模式refactoring自动化解决方案研究.pdf.pdf 免费下载

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

文档简介

摘要 摘要 目前,在发达国家已经存在大量既存的应用软件,随着硬件和软件的升级、 软件环境和需求的变化,这些既存软件急需进行适应性维护阻延长软件的生命周 期,因此,在发达国家,软件再工程已经成为主流。 软件工程研究所多年来致力于软件再工程方面的研究和实践,已经取得了显 著的成果,然而,在如何提高既存软件系统的可重用性和可维护性等方面还缺乏 有效的工具支持。 本文通过研究国内外反模式和重构等方面成熟的理论、技术和工具,对软件 再工程过程中所出现的主要的反模式的识别方法和重构技术进行了初步的研究, 提出了一个对反模式进行自动化重构的解决方案,并针对该解决方案设计了与软 件再工程平台集成的可扩充性的框架。 本文首次将反模式的识别技术和重构技术与软件再工程平台相结合,将解决 反模式识别和自动化重构等软件再工程瓶颈问题,大大提高软件再工程的效率和 质量,提高了存软件的可重用性和可维护性。 关键词 极限编程、反模式、重构、自动化、a s - v a b s t r a c t a b s t r a c t p r e s e n t l y ,t h e r eh a v e b e e na l r e a d ye x i s t e dag r e a t d e a lo f l e g a c y a p p l i c a t i o n sa t t h ed e v e l o p e dc o u n t r i e s ,a l o n gw i t ht h eu p g r a d eo ft h e h a r d w a r ea n ds o f t w a r e ,t h ec h a n g e so fs o f t w a r ee n v i r o n m e n ta n dn e e d s ,t h e s e a p p l i c a t i o n s a r ei nd i r en e e do fa d a p t a b i i i t ym a i n t e n a n c ei no r d e rt o p r o l o n g t h e l i f e c y c l e o ft h es o f t w a r e t h e r e f o r e ,a tt h e d e v e l o p e d c o u n t r i e s , s o f t w a r er e e n g i n e e r i n gh a sb e e nb e c o m et h em a i n s t r e a m i nt h el a s ty e a r s ,s o f t w a r ee n g i n e e r i n gi n s t i t u t et a k e su pw i t ht h e r e s e a r c ha n dp r a c t i c eo fs o f t w a r er e e n g i n e e r i n ga n dh a sb e e no b t a i n e d m a r k e dr e s u l t h o w e v e r ,a tt h ea s p e c to fh o wt oi n c r e a s et h er e u s a b i l i t y a n dm a i n t a i n a b i l i t yo ft h el e g a c ys o f t w a r es y s t e m ,w es t i l ll a c ko fv a l i d t o o l st os u p p o r t t h i st h e s i sp r i m a r i l yr e s e a r c h e d t h e r e c o g n i t i o n m e t h o da n d r e f a c t o r i n gt e c h n i q u eo ft h em a i na n t i p a t t e r n st h a ta p p e a r sa tt h ep r o c e s s o fs o f t w a r er e e n g i n e e r i n gb ys t u d y i n gt h ed o m e s t i ca n di n t e r n a t i o n a l m a t u r et h e o r i e s ,t e c h n i q u e sa n dt o o l so fa n t i p a t t e r n sa n dr e f a c t o r i n g s , a n dp u tf o r w a r das o l u t i o no fa n t i p a t t e r na u t o m a t i z a t i o nr e f a c t o r i f i g ,a n d f o rt h i ss o l u t i o nw ed e s i g n e da ne x t e n d a b l e f r a m e w o r kt h a t i n t e g r a t e d t o g e t h o rw i t ht h e s o f t w a r er e e n g i n e e r i n gp l a t f o r m t h i st h e s i sf o rt h ef i r s tt i m ei n t e g r a t e dt h ea n t i p a t t e r nr e c o g n i t i o n t e c h n i q u ea n dt h er e f a c t o r i n gt e c h n i q u ew i t ht h es o f t w a r er e e n g i n e e r i n g p l a t f o r m i t w i l lr e s o l v et h eb o t t l e n e c kp r o b l e m o f a n t i p a t t e r n r e c o g n i t i o na n d a u t o m a t i z a t i o nr e f a c t o r i n gi n s o f t w a r e r e e n g i n e e r i n g , i n c r e a s eg r e a t l yt h ee f f i c i e n c ya n dq u a n t i t yo fs o f t w a r er e e n g i n e e r i n g , a n dt h er e u s a b i l i t ya n dm a i n t a i n a b i l i t yo ft h el e g a c y s o f t w a r e i i i 北京工业人学工学硕士学位论文 k e y w o r d e x t r e m ep r o g r a m m i n g 、a n t i p a t t e r n 、r e f a c t o r i n g 、a u t o m a t i z a t i o n 、 a s v j v 独创性声明 本人声明所呈交的论文是我个人在导师指导下进行的研究工作及取得的研 究成果。尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他 人已经发表或撰写过的研究成果,也不包含为获得北京工业大学或其它教育机构 的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均 已在论文中作了明确的说明并表示了谢意。 签名:翊! 鱼叁: 日期:五! 生:! 翌 关于论文使用授权的说明 本人完全了解北京工业大学有关保留、使用学位论文的规定,即:学校有权 保留送交论文的复印件,允许论文被查阅和借阅;学校可以公布论文的全部或部 分内容,可以采用影印、缩印或其他复制手段保存论文。 ( 保密的论文在解密后应遵守此规定) 签名:自! 丑盘: 导师签名: 第1 章绪论 第1 章绪论 1 1 学术背景及理论与实际意义 软件工程自诞生以来,虽然各种理论、方珐、技术、工具层出不穷,但是似乎丝 毫没有摆脱“软件危机”的尴尬局面,于是,悲观主义者把软件工程“没有银弹”的 论调天天挂在嘴上,“这也不是银弹,那也不是银弹”,好像是放之四海而皆准的法则 一样。然而,最近十几年在软件工程领域取得的理论和实践成果还是令人振奋的。其 中,以“四人帮”为首发起的“模式运动”为系统设计者点亮了明灯;以m a r t i n f o w l e r 和k e n t b e c h 为代表的极限编程的成功实践使“焦油坑”中的“史前巨兽”眼前顿时 一亮,好像抓住了一根救命稻草。 1 1 1 模式运动 美国加利佛尼亚大学环境结构中心研究所所长a l e x a n d e r 博士用了约2 0 年的时 间,对舒适住宅和周边环境进行了大量的调查和资料收集工作,发现人们对舒适住宅 和城市环境存在着共同的认同规律。他把它们归纳为2 5 3 个模式,对每一个模式都从 c o n t e x t ( 模式可适用的前提条件) 、t h e m e 或p r o b l e m ( 在特定条件下要解决的目标 问题) 、s o l u t i o n ( 对目标问题求解过程中各种物理关系的记述) 三个侧面进行描述, 并给出了从用户需求条件分析到建筑环境结构设计直至经典实例的过程模型。 所谓“模式”是指遵从某种规则或规律反复出现的思维方式或表现。a l e x a n d e r 把模式的集合称为模式语言( p a t t e r nl a n g u a g e ) 。构成模式语言的各模式是针对某一 特定前提的解法,它们记述着我们身边频繁发生的某类问题及其基本解法。我们可以 反复使用这些解法,对同类问题可以使用同一解法,而不必总是一切从头做起。模式 并不是单独存在的,它们可以由粒度小的模式组合而成,也可以和其他模式一起组合 成粒度更大的模式。 1 9 9 0 年,软件工程界开始关注这一住宅、公共建筑与城市规划领域的重大突破。 北京工业人学工学硕士学位论文 最早将该思路引入软件工程方法学的是1 9 9 1 1 9 9 2 年以“四人帮( g a n 2o ff o u r , g o f ) ”自称的四位著名软件工程学者,他们在1 9 9 4 年归纳发表了2 3 种设计模式, 旨在用模式来统沟通面向对象方法在分析、设计和实现间的鸿沟。 软件模式是将“模式”的般概念用于软件开发领域,即软件开发的总体指导思 路或参照样板。软件模式并非仅限于“设计模式”,还有“体系结构模式”、“分析模 式”、“过程模式”等,软件生存期的各个阶段都存在着被认同的模式。换言之,是不 是软件模式取决于是否按照模式的基本构成方式来描述,两与问题域和以软件生存期 的哪一阶段为对象无关。根据这一思路,近来的模式化研究已将模式概念的应用从软 件开发领域推广到组织机构、应用业务、经营活动甚至日常生活领域。对此西方称之 为“模式化运动”。 1 1 2 由模式到反面模式 t 9 9 6 年米切尔阿克鲁( m i c h a e la k r o y d ) 提出反( 面) 模式( a n t i p a t t e r n s ) 的概念,它 研究频繁出现的最劣软件模式、失败模式,并给出改善它们的解决方案。具体说反( 面1 模式主要研究最常见的拙劣软件模式特征、识别方法,以及改善( r e f a c t o r i n g ) 方法。 据美国程序员杂志1 9 9 5 年7 月号提供的统计资料,软件项目的大约六分之 五存在失败的部分;三分之一申途而废,三分之二预算经费翻番,其中一半用于需求 和设计变更。通过r e f a c t o r i n g 可将再工程中比比皆是的反面模式改造为可以重用的 正面模式( 参看图l ,1 ) ( 引自文献 2 】) 。 第1 章绪论 退进搓式 1 1 3 极限编程 匡亘撞立 ! ! ! ! 曼! ! ! ! ! 烹 图卜1 软件设计模式与反面模式 需求变更是软件工程所面对的永恒的问题,没有一个软件开发者能够事先正确理 解系统的需求。传统的软件开发方法学提倡预先设计( u p f r o n td e s i g n ) ,这往往导致 系统的过度设计( o v e r - e n g i n e e r i n g ) 或设计不足。所谓过度设计,是指代码的灵活性 和复杂性超出了系统需要的水平1 5 】,而“实用”是软件压倒一切要素 3 】:设计不足就 会导致设计变更,系统的设计者是极不情愿在系统开发的后期改变原先的设计的,于 是就采用打补丁的方式来应对需求变更,最后系统完全失去了初期“完美”的结构。 近几年兴起的敏捷软件开发是一种捐j 抱变化的快速软件开发的方法学,与传统的 软件丌发方法学相比,敏捷软件开发的系统设计“不再是一切动作的前提,而是在整 北京工业人学工学硕士学位论文 个开发过程中逐渐浮现出来的”( m a r t i n 语) 。敏捷软件开发的价值观是个体和交互胜 过过程和工具、可以工作的软件胜过面面俱到的文档、客户合作胜过合同谈判、响应 变化胜过遵循计划【1 0 】。 极限编程( e x t r e m ep r o g r a m m i n g ) 是敏捷软件开发方法中最著名的一个。它是 由一系列简单却相互依赖的实践组成,其中最关键的三个实践是重构( r e f a c t o t i n g ) 、 单元测试、日创建。 代码往往会腐化。随着我们添加一个一个的特性,处理一个一个的错误,代码的 结构会渐渐的退化,如果置之不理的话,最终导致系统混乱,难于维护。极限编程的 实践者不断的用r e f a e t o r i n g 来阻止这种退化。r e f a c t o f i n g 就是在不改变代码行为的 前提下,对其进行一系列的小改造,旨在改进系统结构的实践活动。每个改造都是微 不足道的,几乎不值得去做,但是所有这些改造叠加在一起,就形成了对系统设计和 构架显著的改进。 1 1 4 本课题的意义 本课题的理论与实际意义是:将r e f a c t o r i n g 技术与软件再工程过程相结合,解 决软件再工程过程中反面模式识别及r e f a c t o r i n g 自动化这一瓶颈问题。 1 2 国内外文献综述 ( ( a n t i p a t t e m s :r e f a c t o r i n gs o f t w a r e ,a r c h i t e c t u r e s ,a n dp r o j e c t si nc r i s i s ) ) 一书中, 作者对反模式进行了定义,并给出了一个参考模型。之后,从反面开发模式、反面体 系结构模式和反面管理模式对反模式进行了归纳介绍。本书开创了反模式研究的先 河。 文献( ( p r a c t i c a l a n a l y s i sf o r r e f a c t o r n g ) ) 中作者首先对r e f a c t o r i n g 给出了一个新的定义,这个定义关注于r e f a c t o r i n g 的前件( 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 ) ,而不是代码改造本身。之后,作者根据r e f a c t o 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 之间依赖 第1 苹绪论 和动态r e f a c t o r i n g 的理论和方法。最后,作者对r e f a c t o 血g b r o w s e r 自动化r e f a c t o 血g 工具的体系结构做了简单的介绍,并给出了些r e f a c t o f n g 自动化支持工具开发的 一些宝贵经验。 r e f a e t o r i n g :i m p r o v i n g t h ed e s i g n o f e x i s t i n gc o d e ) 被誉为与设计模式齐名 的经典巨著。书中,作者给出了2 2 种代码的坏味道和7 0 多种行之有效的r e f a c t o r i n g 方法。它的最主要的贡献是把r c f a c t o f i n g 的概念和想法逐一落实在严谨的准则和严 密的手法之中。 1 3 相关领域研究现状 1 3 1 软件再工程领域研究现状 再工程是对次工程后的成品软件再次进行开发。软件维护期的适应性、完善性、 预防性维护都属再工程范畴。当今软件系统的规模变得越来越大,结构也越来越复杂, 而从头开始构建的大系统数量在急剧地减少,很多既存系统正在被逐步地利用。越是 庞大、悠久的系统,特别是导入计算机较早的一些重要应用领域,如银行、证券、物 流,乃至政府、军用部门等,它们沉淀的历史遗产越雄厚,价值越高,越不能淘汰。 如图1 2 所示,2 0 世纪9 0 年代以后,先进国家的既存软件维护性开发已占软件 开发总量的8 0 以上。可以说,软件工程已经进入了再工程时代。 1 9 8 0 年 9 9 0 年 2 0 0 0 皋 图1 - 2 软件工程中一次工程和再工程比铡趋势国 软件工程研究所多年来以模式思路在软件再工程领域进行了广泛的研究和实践, 取得了显著的成果并开发了一系列的支持工具。 o v w b l 1 、e v w b l 2 、e v w b l ,3 是软件工程研究所与目立联合研究和开发的面 向模式的w e b 化再工程工作平台。e v w b l ,l 是将v b 6 应用程序升级到s e r v l e f f a p p l e t 结构的w e b 应用程序的自动化解决方案;e v w b l 2 是将c s 结构的p b 应用程序升 级到s e r v l e t j s p 结构的w e b 应用程序的自动化解决方案;e v w b i 3 是将c 语言的应 用程序升级到s e r v l e t , j s p 结构的w e b 应用程序的自动化解决方案。e v w b 系列工具 以面向模式的思路解决w e b 化再工程豹问题已经在实际应用中取得了显著的效榘。 s f r e 是软件工程研究所与日立联合研究和开发的软件再工程调查辅助工具。它 的主要功能是为既存系统提供逆向分析,并生成分析报告:调奄式样变更影响范围: 分析系统中没有被使用的类和方法。s h 娆逐渐成为我们在软件再工程过程中不可或 缺的得力助手。 a s - v 是软件工程研究所独自研究和开发的面向模式的软件再工程自动化解决方 案集成平台,它能够有效的管理各种软件再工程自动化解决方案,是对e v w b 系列 l 娶的改进a a s v n e t 是目前我们正在研发的建立在a s v 平台上的从v b 6 到v b n e t 级的自动化解决方案。 第1 章绪论 1 3 2 r e f a c t o r i n g 技术研究现状 目前,r e f a c t o r i n g 技术主要应用在面向对象的编程语言中,如s m a l l t a l k 、j a v a , 针对其它语言的r e f a c t o f i n g 工具尚未出现。在支持r e f a c t o f i n g 的工具中,比较成功 的有三个工具:r e f a c t o f i n gb r o w s e r 、i n t e l l j i d e 、e c l i p s e 。这三个工具都将r e f a c t o f i n g 功能与集成开发环境集成在一起,方便了程序员的使用,使得程序员在极限编程实践 中使用r e n c t o f i n g 成了日常习惯。 1 3 3 存在不足 目前,在国内外,对软件再工程领域、r e f a c t o f i n g 的自动化理论和支持工具方面 的研究很多,但是还存在以下的不足: 流行的r e f a c t o f i n g 工具中对于大型的r e f a c t o r i n g 支持不够。 对反模式的自动化识别技术研究还不够。 将反模式识别技术与r e f a c t o n n g 技术相结合的研究很少。 将反模式识别技术、r e f a e t o f i n g 技术相结合并应用于软件再工程过程实践中 的研究则更少。 1 4 课题来源及研究内容 本课题是软件工程研究所长期在软件再工程领域的研究和实践中所提出来的,将 作为面向领域模式的组件化再工程整体解决方案( w s w b ) 的一部分。本课题主要研 究软件再工程过程中所面临的主要的反模式及反模式的识别和r e f a c t o f i n g 的自动化 问题,为从既存系统中提取可重用的组件提供支持,并且为提高既存系统的可重用性 和可维护性提供自动化支持。 扯京工业人学王堂硕士学位论文 1 5 本文组织结构 绪论中介绍了本课题的学术背景、理论意义、相关领域的研究现状、课题来源、 以及本文的研究内容和组织结构。在第2 章中介绍了r e f a c t o r i n g 的自动化理论与技 术的研究。第3 章介绍反模式识别的理论与技术的研究。第4 章详细介绍了反模式 r e f a c t o f i n g 自动化解决方案框架的设计。第5 章通过一个简单的例子介绍了一下反模 式r e f a c t o r i n g 自动化解决方案的处理流程。第6 章对本课题的前景展望。 第2 章r e f a c t o r i n g 自动化理论技术研究 第2 章r e f a c t o r i n g 自动化理论技术研究 我参加过一个大型项目的定制化生产,整个系统极其复杂,说它复杂除了业务逻 辑上有一定的复杂性,更主要是因为其代码的质量非常恶劣:全局变量泛滥;重复代 码、废码普遍;变量、函数命名随便;模块之间过度耦合,函数过长等等,所有这一 切导致维护非常困难,修改一个b u g 通常要几个小时甚至几天时间,而且往往修改 一个b u g 引入几个新的b u g 。在这种情况下,大家没人愿意停下手头的工作来对代码 进行一下整顿,都遵循那旬古老的软件工程谚语“如果它还可以运行,就不要动它”, 这是因为,在没有一个可靠的r e f a c t o r i n g 工具支持的情况下手工进行r e f a c t o r i n g 需 要花费很大的时间,并冒着引入更多b u g 的风险,与对程序进行缝缝补补相比还是 得不偿失的。因此,一个可靠的自动化r e f a c t o 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 工具的 r e f a c t o r i n g 模型。 2 1 r e f a c t o r i n g 定义 o p d y k e 和j o h n s o n 对r e f a c t o r i n g 的定义是“在不改变程序外部行为的情况下对 代码的变换”。这个定义有三个深层次的问题: 一对“不改变程序的外部行为”如何界定? 通常的理解是对一个给定的输入, 产生相同的输出。例如,如果某段代码的一个r e f a c t o r i n g 使得代码的运行时间增加 了1 0 毫秒,而没有改变其输出,我们通常认为是没有改变程序的外部行为。但是, 对一个实时性要求比较高的应用,类似的改变可能就被认为是改变了程序的外部行 为。 二不易证明我们对程序的变换是否影响了程序的外部行为。 三有些对程序的变换虽然改变了程序的外部行为,但若这种变换是非常特殊的、 并无关大局时,应该是被允许。 文献【4 中给出的r e f a c t o r i n g 的定义是:r e f a c t o r i n g 是一个二元关系r = ( p r e ,t ) , 其中p r e 是在对程序执行r e f a c t o t i n g 时必须满足的断言,称为r e f a c t o r i n g 的前件,t 0 北京工业人学工学硕士学位论文 是对程序的变换。这个定义即包含了不改变程序外部行为的变换,也包含了改变程序 外部行为的变换。 为了计算r e f a c t o r i n g s 之间的依赖关系,该文献又引入了后件的概念,并对 r e f a c t o r i n g 的概念进行了扩展:r e f a c t o r i n g 是一个有序三元组r = ( p r e ,t ,p ) ,其中p 是一个从断言到断言的函数,当程序执行r e f a c t o d n g 时,它将被执行来产生一些新 的断言。 2 2 r e f a c t o r i n g 分类 r e f a c t o f i n g 一般可分为原子r e f a c t o r i n g 和组合r e f a c t o f 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 、方法r e f a c t o r i n g 和变量r e f a c t o r i n g 。本 文主要研究这些原子r e f a c t o f 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 组合而成。如果原子的r e f a c t o 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 也将能够保证程序的外部行为不变。原子的 r e f a c t o f i n g 很少能够单独使用,它们通常是组合在一起来完成一个比较大的设计的变 更。对于组合r e f a c t o r i n g 的研究,本章将不具体展开,详细介绍请参考文献 4 】第4 章。 2 2 1 类r e f a c t o r i n g 类的r e f a c t o f i n g 主要是指改变系统中类的关系的r e f a c t o r i n g ,有以下三个。 a d d c l a s s ( c l a s s n a m e , s u p e r c l a s s ,s u b c l a s s e s ) 添加一个新的没有被引用的类。 它可用来在类的继承层次中间添加一个类,这时,必须指定这个类的超类及 超类的所有子类。 r e n a m e c l a s s ( c l a s s , n e w n a m e ) 重命名一个类并更新所有对这个类的引用。这 个r e f a c t o r i n g 要合法的前提条件是没有类的名字或全局变量的名字与 n e w n a m e 重名。 r e m o v e c l a s s ( c l a s s ) 从系统中删除一个类。有两种情况可以使这个r e f a c t o r i n g o 第2 章r e f a c t o r i n g 自动化理论技术研究 合法: 1 如果这个类没有被引用并且没有子类。 2 如果这个类没有被引用,有子类,但是一个空类,也就是说没有任何方法 或变量。这种情况下,如果这个类被删除的话,它的所有的子类都变成其 超类的予类。 2 2 2 方法r e f a c t o 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 。这类r e f a c t o r i n g 与非 面向对象语言的操作相似,只是面向对象语言多了封装性和多态性。包括以下几个基 本的r e f a c t o r i n g 。 a d d m e t h o d ( c l a s s s e l e c t o r , b o d y ) 往系统中添加一个新的没有被引用的方法。这 个r e f a c t o r i n g 要合法的前提条件是,c l a s s 及其超类中没有相同名字的方法。 要在子类中添加与超类中有相同名字的方法,该方法的在语义上必须与超类 中的方法相等。 r e n a m e m e t h o d ( c l a s s e s , s e l e c t o r , n e w n a m e ) 重命名一组已经存在的方法的名字 并更新所有对该方法调用的地方。如果一个要重命名的方法是多态的,所有 与该方法有多台关系的类必须在c l a s s e s 内,否则,该r e f a c t o r i n g 将是不合 法的。 r e m o v e m e t h o d ( c l a s s 。s e l e c t o r ) 从系统中删除一个没有被引用的方法。如果超 类中有与该方法语义上相等的方法的话,该r e f a c t o r i n g 也是合法的。 m o v e m e t h o d ( c l a s s s e l e c t o r , d e s t v a r n a m e , n e w s e l e c t o r ) 将一个方法从一个类中 移动到类d e s t v a r n a m e 中,并给它一个新的名字n e w s e l e c t o r 。原先的方法被 替换成对新的方法的调用。 2 2 3 变量r e f a c t o r i n g 变量的r e f a c t o r i n g 主要是对类中成员变量的进行修改的r e a f e t o r i n g 。 北京工业人学工学硕士学位论文 a d d l n s t a n c e v a r i a b l e ( c t a s s , v a r n f a m e ,i n i t c l a s s ) 在类c l a s s 中添加一个新的没 有被引用的成员变量并被初始化为i n i t c l a s s 。 r e m o v e l n s t a n c e v a r i a b l e ( c l a s s ,v a r n a m e ) 从类c l a s s 中删除一个成员变量。这 个成员变量必须没有被c l a s s 及其子类引用。 r e n a m e i n s t a n e e v a r i a b l e ( c l a s s , v a r n a m e ,n e w n a m e ) 重命名一个成员变量,并 更新所有对它的引用。 p u l l u p i n s t a n c e v a r i a b l e ( c t a s s , v a r n a m e ) 删除c l a s s 的所有子类中的一个成员 变量,并将该成员变量添加到c l a s s 中。 p u s h d o w n i n s t a n e e v a r i a b l e ( c l a s s ,v a r n a m e ) 删除类c l a s s 中的一个成员变量, 并将该成员变量添加到c l a s s 的直接子类中。该r e f a c t o r i n g 要合法的前提条 件是c l a s s 中没有对该成员变量的引用。 a b s t r a c t l n s t a n c e v a r i a b l e ( c l a s s ,v a r n a m e , g e t t e r , s e t t e r ) 将所有对成员变量直接 引用的地方都替换成g e t t e r 或s e t t e r 。 2 3 程序变换 程序语言都可以用文本的表现形式来储存,而文本格式不易于表达程序元素之间 的关系。编译器的开发者利用抽象语法树解决了这个问题,抽象语法树是程序的另一 种表现形式,它能够较清晰的表达程序元素间的关系。此外,还有一些其他的表现形 式,如控制流图( c f g s ) 和程序依赖图( p d g s ) 。 一个工具如果同时使用多种程序的表现形式,它必须保持它们之间的同步,这将 是非常耗时的。m o r g e n t h a l e r 在文献1 2 6 e ? 提出了一种用来从抽象语法树中提取包含 控制流图和程序依赖图信息的算法,这将使得我们没有必要来创建和维持这些程序表 现形式在内存中的结构。 进行程序变换最自然的方法就是利用抽象语法树,变换规则用成对的代码表示。 如图2 一l 所示,我们称这些代码对为模式对,前面的代码为匹配模式,后面的代码为 修改模式。程序变换时,我们先将模式对分析成模式树,再利用匹配模式树来进行匹 配,利用修改模式树来对程序进行变换。 l2 第2 章r e f a c t o r i n g 自动化理论技术研究 o b j e c t l + 0 1 d m e t h o d o o b j e c t l n e w m e t h o d 0 图2 - 1 代码模式对 2 4 程序分析 进行程序变换简单,但是要保证程序的外部行为不改变就困难了。为确保一个 r e f a c t o r i n g 动作合法,程序必须满足一定的条件,我们可以通过对程序的分析来判断 程序是否满足这些条件。 分析功能必须能够描述程序中各个元素间的关系。例如,在面向对象的语言中, 要能够描述类、方法和成员变量之间的关系。此外,还要有分析功能,如判断一个变 量是否是一个类的成员变量。 元素阃关系,有些可以从程序的静态文本中取得,有些则很难计算,如判断一个 变量所引用的对象每次是否只被一个类的实例所引用,对于这类判断,r e f a c t o r i n g b r o w s e r 中的做法是将程序运行起来,进行动态判断。分析功能可以被分为两类:基 本分析功能和导出分析功能。导出分析功能是由基本分析功能推导出来的。 r e f a c t o r i n g 的前件即包括基本分析功能又包括导出分析功能,后件则只能包括基本分 析功能。 2 4 。1 基本分析功能 本小节描述了判断r e f a c t o r i n g 是否有效所需要的最基本的程序的分析功能。这 是程序分析框架的基础。 i s c l a s s ( c 加j ) 如果系统中存在一个类名字为c l a s s 则返回t r u e ,否则,返回 f a l s e 。 i s g l o b a l ( h d 删e ) 如果系统中存在一个全局变量名字为n a m e 则返回t r u e ,否 则,返回f a l s e 。 c l a s s r e f e r e n c e s ( c 如s s ) 返回所有直接引用c l a s s 的方法的 x 寸。 s u p e r c l a s s ( c l a s s ) j 压_ c l a s s 的直接超类,如果没有超类,则返回j _ 。 1 1 m e t h o d ( c l a s s ,s e l e c t o r ) 返回c l a s s 中定义为s e l e c t o r 的方法的抽象语法树。 r e f e r e n e e s t o l n s t a n c e v a r i a h l e ( c l a s s , v a r n a m e ) 返回所有引用类c l a s s 的成员变 量v a r n a m e 的方法的 对。 s e n d e r s ( c l a s s ,s e l e c t o r ) 返回所有调用c l a s s 中定义为s e l e c t o r 的方法的结点。 c l a s s o f f c l a s s , v a r n a m e ) 返回所有保存在c l a s s 的成员变量v a r n a m e 中的值所 对应的的类信息。 i n s t a n e e v a r i a b l e d e f i n e d b y ( c l a s s ) 返回c l a s s 中的所有的成员变量。 i s e x e l u s i v e ( c l a s s , v a r n a m e ) 如果成员变量v a r n a m e 中的对象在同一时刻只被 一个c l a s s 的实例所引用的话,则返回t r u e ,否则,返回f a l s e 。 2 4 2 导出分析功能 导出分析功能对描述r e f a e t o r i n g 的前件非常有用,能够从基本分析功能计算出 来。例如: s u b c l a s s e s ( c l a s s ) 返回类c l a s s 的全部直接子类。 s u b c l a s s e s ( c l a s s ) ; c j s u p e r c l a s s ( c ) = c l a s s s u b c l a s s e s * ( c l a s s ) 返回类c l a s s 的全部子类。 佃 鼬弧姗“幽卵净 y c 酗嘶 ) y 觑6 州c ) i fs u b c l a s s e s ( c l a s s 、= 西 o t h e r w i s e i s e m p l y c l a s s ( c l a s s ) j t f l 果类c l a s s 即没有方法也没有成员变量,则返回t r u e 否则返回f a l s e 。 i s e m p t y c l as s ( c l a s s ) 一了s d e f i n e s s e l e c t o r ( c l a s s ,s ) a v d 量彝n e s i n g a n c e y n r i e b t e c l a s s s ) s u p e r c l a s s + ( c l a s s ) 返回类c l a s s 的所有超类。 1 4 第2 章r e f a c t o r i n g 自动化理论技术研究 f m 跚8 7 a 删+ ( 。妇) 5 脚8 r s s ( c 妇) ) y 却p r 踟s + ( s u p e ,c l 卿( 妇s ) ) js u p 甜c l 理s s ( c l n s s ) = l 0 t e r w i s e d e = | f i n e s ;s e l e e t o r ( c l a s s , s e l e c t o r ) 如果类c l a s s 中定义了s e l e c t o r ,n n _ n t r u e , 否则返回f a l s e 。 d e f i n e s s e l e c t o r ( c l a s s ,s e l e c t o r ) m e t h o d ( c l a s s ,s e l e c t o r ) 上 l o o k e d u p m e h t o d ( c l a s s , s e l e c t o r ) 返n s e l e c t o r 被发送给c l a s s 时,将被调用 的方法的实体。 l o o k e d u p m e t h o d ( c l a s s ,s e l e c t o r ) 三 rl f 一 m e t h o d ( c l a s s ,s e l e c t o r ) il o o k e d u p m e t h o d ( s u p e r c l a s s ( c l a s s ) ,s e l e c t o r ) i f c l a s s = 上 i fm e t h o d ( c n s s 。s e l e c t o r ) 上 o t h e r w 话e u n d e r s t a n d s s t f l e c t o r ( c l a s s j p 把c 幻r ) 如果c l a s s 的一个是实例对j e 尼c f d r 做出响 应,则返回t r u e 。 、 u n d e r s t a n d s s e 彪? c t o r ( c l a s s , s e l e , c t o r ) 兰 3 c 硅 c l a s s y s u p e r c l a s s + ( c l a s s ) d e f i n e s s e l e c t o r ( c ,s e l e c t o r ) d e f i n e s , i t s t a n c e v a r i t l b f e :( c l a s s , r k 肌g ) 如果c l a s s 中定义了命名为v a r n a m e 的成员变量,则返回t r u e 。 d e f i n e s i n s t a n c e v a r i ab l e ( c l a s s , v a r n a m e ) v a r n a m e i n s t a n c e v a r i a b l e s d e f i l n e d b y ( c l a s s ) 北京工业人学工学硕士学位论文 2 5 抽象语法树功能 很多r e n c t o f i n g 都需要修改程序的抽象语法树,这些修改将影响以后r e f a c t o r i n g 的分析功能。这一小节,我们简单的描述一下抽象语法树的变换功能,这些功能自够 减少以后的分析。 i s g e t t e r ( m e t h o d , v a r i a b l e ) 如果方法m e t h o d 是变量v a r i a b

温馨提示

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

评论

0/150

提交评论