【技术分享】重构

47 阅读3分钟

一、WHAT(什么是重构)

image.png  

重构定义

“我会用“结构调整”(restructuring)来泛指对代码库进行的各种形式的重新组织或清理,重构则是特定的一类结构调整”

——————   Martin Fowler

重构优化
相同两者都需要修改代码两者都不会改变程序的整体功能
不同目的为了让代码“更容易理解,更易于修改”可能使程序运行得更快,也可能更慢只关心让程序运行得更快最终得到的代码有可能更难理解和维护

二、WHY(为什么要重构)

image.png

image.png

 

 

  • 提高编程速度

  • 代码更容易理解

  • 帮助找到bug


三、WHEN(什么时候重构)

1.什么时候应该重构

分类目的eg
见机行事的重构预备性重构让添加新功能更容易原先系统只支持顺丰同城,新需求需要支持蜂鸟、美团加新功能前重构,引入策略模式
帮助理解的重构使代码更易懂原先一个方法1000行代码,看到结尾忘了开头对代码聚类,抽取出几个方法
捡垃圾式重构使代码更优代码本身可以被理解在干什么,但做得不好,比如:条件判断时,使用双重否定对代码优化,改为肯定
有计划的重构review代码时重构事前发现bug、防腐化结对编程
技术需求重构事后清理技术债务sonar定期扫描

2.什么时候不应该重构

原因eg:
代码丑陋,但并不需要修改它没有价值一个方法不超过50行,里有10多个条件分支
重写比重构还容易代价太大,效果一般一个方法2000行

四、WHO(谁来重构)

image.png

 

  • 拥有代码权限的人

  • 功能分支代码没有重叠的人

  • 理解代码上下文的人


五、WHERE(重构哪里)

代码坏味道(20+)

1.神秘命名(Mysterious Name)

image.png

2.重复代码(Duplicated Code)

image.png 3.过长函数(Long Function)

image.png 4.发散式变化(Divergent Change)

每增加一个功能就需要修改一堆方法 -----  容易错过某个重要的修改

坏味道 eg  image.png 正确eg 

image.png 5.霰弹式修改(Shotgun Surgery)

每增加一个功能需要在很多不同的类做出修改 ---- 很难找到它们,容易错过某个重要的修改

怀味道eg 

image.png 正确eg 

image.png 6.注释(Comments)

并不是说不该写注释!!!注释是为了帮助理解一些复杂的逻辑,逻辑变了,注释也要及时更新,否则会帮倒忙

注释可以带我们找到很多坏味道,把坏味道去除之后,我们常常会发现:注释已经变得多余了,因为代码已经清楚地说明了一切,代码即注释


六、HOW(怎么重构)

利用编译器安全重构

方法:“抽、替、组、改、移

1.抽

可抽取变量、字段、方法、接口、父类

image.png

2.替

内联,抽的反向动作

image.png 3.组

封装

image.png 4.改

重命名

image.png 5.移

image.png


七、HOW MUCH(重构到什么程度)

重构的关键在于运用大量微小且保持软件行为的步骤,一步步达成大规模的修改。每个单独的重构要么很小,要么由若干小步骤组合而成。

在重构的过程中,代码应当很少进入不可工作的状态,即便重构没有完成,也可以在任何时刻停下来。

前提:重构前建立,ut防护

原则:小步快跑

步骤:修改一部分代码,跑一边ut,全部通过后,commit,再修改一部分代码,跑一边ut,全部通过后,commit;依次循环