重构-改善既有代码的设计_第1页
重构-改善既有代码的设计_第2页
重构-改善既有代码的设计_第3页
重构-改善既有代码的设计_第4页
重构-改善既有代码的设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

重构-改善既有代码的设计 ——目录重构是对软件内部结构的一种调整,目的是在不改变外部行为的前提下,提高可理解性,降低修改成本。重构是严谨、有序地对完成的代码进行整理从而减少出错的一种方法。什么是重构?重构概述

重构概述

改进程序设计

程序员为了快速完成任务,在没有完全理解整体架构之前就修改代码,导致程序逐渐失去自己的结构。重构则帮助重新组织代码,重新清晰的体现程序结构和进一步改进设计。

提高程序可读性

容易理解的代码很容易维护和增加新功能。代码首先是写给人看的,然后才是计算机看的。

为何重构?重构概述

助你找到程序错误

重构是一个CodeReview和反馈的过程。在另一个时段重新审视代码,会容易发现问题和加深对代码的理解。

助你提高编程速度

设计和代码的改进都可以提高开发效率,好的设计和代码都提高开发效率的根本。提高设计和编码水平

对代码的重构,是快速提高设计和编码水平的方法。

为何重构?重构概述

增加新功能时一并重构

增加功能前需要理解修改的代码,如果发现代码不易理解且无法轻松增加功能,此时就需要对代码进行重构。

修补错误时一并重构

通过重构改善代码结构,能够帮助你找出BUG原因。

Review代码时一并重构

有经验的开发人员Review代码时能够提出一些代码重构的建议。

何时重构?重构概述

重构与设计彼此互补

良好的设计是重构的目标,重构弥补设计的不足。

重构使得设计方案更简单

如果选择重构,预先设计时候只需找出足够合理的解决方案,实现的时候对问题会进一步加深,此时可以重构成最佳的解决方案。

重构能够避免过度设计

设计人员需要考虑将简单方案重构成灵活方案的难度。如果容易,只需实现简单方案。

重构与设计重复的代码(DuplicatedCode)☆☆☆☆☆

重复代码是最常见的异味,往往是由于Copy&Paste造成的。

重构方法:重复代码在同一个类中的不同方法中,则直接提炼为一个方法如果重复代码在两个互为兄弟的子类中,则将重复的代码提到父类中如果代码类似,则将相同部分构成单独函数,或者用TemplateMethod设计模式

代码的坏味道

☆表示坏味道指数代码的坏味道

重复代码出现在不相干的类中,则将代码提炼成函数或者放在独立的类中

代码的坏味道

4.过长的参数列(LongParameterList)☆☆☆☆

过长的参数列难以理解,而且容易传错参数。

重构方法:将参数列表用参数对象替换代码的坏味道

5.发散式变化(DivergentChange)☆☆☆

一个类由于不同的原因而被修改。

重构方法:将类拆分成多个,每个类只因为一种变化而修改

发散式变化实例代码的坏味道

包含多种证券的业务逻辑将业务逻辑放到证券类中霰弹式修改实例代码的坏味道

计算逻辑分散在各个类中计算逻辑放到股指期货类中代码的坏味道

7.依恋情结(FeatureEnvy)☆☆☆

函数对某个类的兴趣高过对自己所处的类,通常是为了取其他类中的数据。

重构方法:将函数部分功能移到它感兴趣的类中8.数据泥团(DataClumps)☆☆☆

在多个地方看到相同的数据项。例如:

多个类中相同的变量,多个函数中相同的参数列表,并且这些数据总是一起出现。

重构方法:将这些数据项放到独立的类中

代码的坏味道

9.分支语句(SwtichStatements)

☆☆☆☆

大量的分支、条件语句导致过长的函数,并且可读性差。

重构方法:应将它变成子类或者使用State和Strategy模式

代码的坏味道

10.过度耦合的消息链(MessageChains)

☆☆☆

一个对象请求另一个对象,后者又请求另外的对象,然后继续。。。。,形成耦合的消息链。

重构方法:公布委托对象供调用

代码的坏味道

11.过多的注释(Comments)☆☆

代码有着长长的注释,但注释之所以多是因为代码很糟糕。

重构方法:先重构代码,再写上必要的注释12.夸夸其谈未来性(SpeculativeGenerality)☆☆☆

现在用不到,觉得未来可以用到的代码,要警惕。

重构方法:将用不上的代码去掉

代码的坏味道

13.纯粹的数据类(DataClass)☆☆☆

将数据类中数据以Public方式公布,没对数据访问进行保护。

重构方法:将数据封装起来,提供Get/Set方法

以上是代码开发和程序维护过程中经常遇到的问题,并不是坏味道的全部。在开发中应避免出现坏味道。

1、提炼函数

(ExtractMethods)重构名录

Stringname=request.getParameter("Name");if(name!=null&&name.length()>0){......}Stringage=request.getParameter("Age");if(age!=null&&age.length()>0){......}Stringname=request.getParameter("Name");if(!isNullOrEmpty(name)){......}Stringage=request.getParameter("Age");if(!isNullOrEmpty(age)){......}privateboolean

isNullOrEmpty(finalStringstring){if(string!=null&&string.length()>0){returntrue;}else{returnfalse;}}重构名录实例将代码段放入函数中,让函数名称解释该函数的用途

2、将函数内联化(InlineMethod)重构名录

如果函数的逻辑太简单,则把其移到调用它的代码中,取消这个函数

5、引入解释性变量(IntroduceExplainingVariable)重构名录

将复杂表达式结果放入临时变量,用变量名来解释表达式用途booleanisMacOs=platform.toUpperCase().indexOf("MAC")>-1;booleanisIEBrowser=browser.toUpperCase().indexOf("IE")>-1;booleanwasResized=resize>0;if(isMacOs&&isIEBrowser&&wasInitialized()&&wasResized){ //dosomething}if((platform.toUpperCase().indexOf("MAC")>-1)&&(browser.toUpperCase().indexOf("IE")>-1)&&wasInitialized()&&resize>0){//dosomething}

6、剖解临时变量(SplitTemporaryVariable)重构名录

一个临时变量多次被赋值(不在循环中),应该针对每次赋值,创造独立的临时变量。doubletemp=2*(_height+_width);System.out.println(temp);temp=_height*_width;System.out.println(temp);doubleperimeter=2*(_height+_width);System.out.println(perimeter);doublearea=_height*_width;System.out.println(area);

7、以卫语句取代嵌套条件语句

(ReplaceNestedConditionalwithGuardClauses)重构名录

函数中条件语句使人难以看清正常的执行路径,用卫语句替换嵌套条件

doublegetPayAmount(){

doubleresult;

if(_isDead)result=deadAmount();

else{

if(_isSeparated)result=separatedAmount();

else{ if(_isRetired)result=retiredAmount(); elseresult=normalPayAmount(); }; }

returnresult;}; doublegetPayAmount(){

if(_isDead)returndeadAmount();

if

(_isSeparated)returnseparatedAmount();

if

(_isRetired)returnretiredAmount();

returnnormalPayAmount();};

8、分解条件表达式(DecomposeConditional)重构名录

从复杂的条件语句分支中分别提炼出独立函数if(date.before(SUMMER_START)||date.after(SUMMER_END))charge=quantity*_winterRate+_winterServiceCharge;elsecharge=quantity*_summerRateif(notSummer(date))charge=winterCharge(quantity);elsecharge=summerCharge(quantity);构筑测试体系

如果你想进行重构,首先要拥有一个可靠的自动化测试环境。自动化测试代码的价值

程序员代码编写只占小部分时间,大部分时间用于调试和查找BUG。自动化测试能够大幅减少由于重构代码及新增功能引人的BUG。XUnit测试框

温馨提示

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

评论

0/150

提交评论