什么是重构

       重构指在不改变程序原有行为的基础上,对代码进行修改,以改进其内部结构。是在代码写好之后,改进它的设计。

       对于小的程序,快速而随性的构建一个简单程序,没什么大不了的。但如果我们构建的代码是复杂系统的一部分,那么就需要评估下代码的好坏了。程序还是可以正常工作,编译器不管代码是美是丑。但是当我们要修改系统,修复bug或扩展功能的时候,问题就出现了。这需要人的参与,人是在乎这个的。丑陋的代码是很难被理解和修改的,由于很难被理解和修改,程序员就有可能犯错,引入bug

       设计模式是针对特定问题的解决方案。其目的是为兼容变化。设计模式有追求完美的渴望,有人指出,在设计前期使用模式常常导致设计过度。单纯对完美的追求,无法写出实用代码

       重构的过程中,由于每次修改的代码幅度都很小,所以很容易发现问题,不必花费大量时间调试。

      一个初级程序员都可以写出让计算机理解的代码,唯独写出让人理解代码的代码,才是优秀的程序员。

重构

第一步:构建测试环境

第二步:分解重组函数

   1. 提取逻辑语句,并提炼成单独函数。

   2. 找出函数局部变量和参数,可参考处理局部变量介绍的各种方法。任何不被修改的变量都可以被当做参数传递给函数。若只有一个变量被修改,则可以把它当做返回值。

 

      重构的目的是使软件更容易理解和修改。内部可以做很多修改,但必须对外部可观察行为不造成变化,或很小的变化。从某种角度来看,重构就是在整理代码,但其提供了一种高效且受控的代码整理技术。

     重构中会发生两种行为:添加新功能和重构改进程序结构。添加新功能不要修改既有代码,只管添加功能便是。重构时不能添加新功能,只管改进程序结构。软件开发过程中这两种行为经常交替变换。

     重构可以改进软件设计。没有重构,代码会逐渐腐败变质。重构则让所有的东西回到应处的位置之上,经常性的重构可以维护代码原有的形态。

     重构使软件更容易理解。在理解代码时,尝试去按自己的理解修改,使代码更趋简洁,随着而来的是看到一些以前看不到的设计层面的东西。加快开发进度,因此最快的开发方式就是重构。 

     重构不需专门拨出时间进行,应该在你添加功能时、修改bug时、复审代码时重构。

     计算机科学的很多问题,都可以通过添加一个间接层来实现。大多数重构都为程序引入更多的间接层,重构会将大型对象拆成多个小型对象,把大型函数拆分为小型函数。间接层是把双刃剑,会导致系统中对象数过多,难以管理。

     知道如何使用设计模式固然重要,但清楚何时不应该使用设计模式也是一种很重要的能力。不要为了设计模式而设计模式,这会导致设计过度。重构也一样。每当需要使用注释时,就需要将要注释的代码写进一个独立的函数中,并以其用途命名。

 

重构技巧

提炼函数

过长的函数很臃肿,承担过多责任。重构的第一步就是提炼函数。

将代码提炼到一个独立函数中,并让函数名解释该函数的用途。

好处:

1.       函数粒度变小,复用机会更大。

2.       上层函数读起来像是在读注释。

3.       细粒度的函数修改起来很容易。

函数名跟函数体之间的语义距离是衡量函数是否好坏的标准。

 

处理局部变量

Replace Temp With Query

若临时变量被用来保存某一表达式的结果,且只被赋值一次,将表达式封装成函数,临时变量的引入点替换为对函数的调用。

 

Inline Variable

将所有对该变量的引用,替换为对它赋值的表达式自身。该方法常作为Replace Temp with Query的一部分在使用。唯一单独使用的情形是将某函数的返回值赋予该临时变量。

Replace Temp with Query的区别在于R是将表达式封装成函数,而此时是直接嵌入表达式。

 

Split Temp Variable

若某个临时变量(不是循环变量,且不是用来收集计算结果)被赋值一次以上,在每次赋值时就需要使用Split Temp Variable分割成多个变量。

 

Introduce Explaining Variable

将复杂表达式的赋值给一个临时变量,以此变量来解释表达式的用途。临时变量可被Extract Method替代。可根据需要选择。

 

Remove Assignments to Parameters

当在函数中对参数进行修改时,使用临时变量取代参数,对临时变量进行修改。

OOD中为对象分配职责很重要,但这项工作很难在设计之初就做的很好,在这种情况下重构可以是我们修改原来的设计。

 

     类往往会因为承担太多责任而变得臃肿不堪,此时可以使用Extract class将一部分责任分离出去。如果类变得不负责任(职责模糊)可以使用Inline Class将其融入另一个类。如果一个类使用了另一个类Hide Delegate可以将此关系隐藏起来。隐藏委托类,常导致拥有者的接口经常发生变化,此时可以使用Remove Middle Man

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值