- 一、WHAT(什么是重构)
- 二、WHY(为什么要重构)
- 三、WHEN(什么时候重构)
- 四、WHO(谁来重构)
- 五、WHERE(重构哪里)
- 六、HOW(怎么重构)
- 七、HOW MUCH(重构到什么程度)
一、WHAT(什么是重构)
重构定义
“我会用“结构调整”(restructuring)来泛指对代码库进行的各种形式的重新组织或清理,重构则是特定的一类结构调整”
—————— Martin Fowler
重构 | 优化 | |
---|---|---|
相同 | 两者都需要修改代码两者都不会改变程序的整体功能 | |
不同 | 目的为了让代码“更容易理解,更易于修改”可能使程序运行得更快,也可能更慢 | 只关心让程序运行得更快最终得到的代码有可能更难理解和维护 |
二、WHY(为什么要重构)
-
提高编程速度
-
代码更容易理解
-
帮助找到bug
三、WHEN(什么时候重构)
1.什么时候应该重构
分类 | 目的 | eg | |
---|---|---|---|
见机行事的重构 | 预备性重构 | 让添加新功能更容易 | 原先系统只支持顺丰同城,新需求需要支持蜂鸟、美团加新功能前重构,引入策略模式 |
帮助理解的重构 | 使代码更易懂 | 原先一个方法1000行代码,看到结尾忘了开头对代码聚类,抽取出几个方法 | |
捡垃圾式重构 | 使代码更优 | 代码本身可以被理解在干什么,但做得不好,比如:条件判断时,使用双重否定对代码优化,改为肯定 | |
有计划的重构 | review代码时重构 | 事前发现bug、防腐化 | 结对编程 |
技术需求重构 | 事后清理技术债务 | sonar定期扫描 |
2.什么时候不应该重构
原因 | eg: | |
---|---|---|
代码丑陋,但并不需要修改它 | 没有价值 | 一个方法不超过50行,里有10多个条件分支 |
重写比重构还容易 | 代价太大,效果一般 | 一个方法2000行 |
四、WHO(谁来重构)
-
拥有代码权限的人
-
功能分支代码没有重叠的人
-
理解代码上下文的人
五、WHERE(重构哪里)
代码坏味道(20+)
1.神秘命名(Mysterious Name)
2.重复代码(Duplicated Code)
3.过长函数(Long Function)
4.发散式变化(Divergent Change)
每增加一个功能就需要修改一堆方法 ----- 容易错过某个重要的修改
坏味道 eg 正确eg
5.霰弹式修改(Shotgun Surgery)
每增加一个功能需要在很多不同的类做出修改 ---- 很难找到它们,容易错过某个重要的修改
怀味道eg
正确eg
6.注释(Comments)
并不是说不该写注释!!!注释是为了帮助理解一些复杂的逻辑,逻辑变了,注释也要及时更新,否则会帮倒忙
注释可以带我们找到很多坏味道,把坏味道去除之后,我们常常会发现:注释已经变得多余了,因为代码已经清楚地说明了一切,代码即注释
六、HOW(怎么重构)
利用编译器安全重构
方法:“抽、替、组、改、移”
1.抽
可抽取变量、字段、方法、接口、父类
2.替
内联,抽的反向动作
3.组
封装
4.改
重命名
5.移
七、HOW MUCH(重构到什么程度)
重构的关键在于运用大量微小且保持软件行为的步骤,一步步达成大规模的修改。每个单独的重构要么很小,要么由若干小步骤组合而成。
在重构的过程中,代码应当很少进入不可工作的状态,即便重构没有完成,也可以在任何时刻停下来。
前提:重构前建立,ut防护
原则:小步快跑
步骤:修改一部分代码,跑一边ut,全部通过后,commit,再修改一部分代码,跑一边ut,全部通过后,commit;依次循环