重构学习笔记

何时重构:

1、不用留出大块的时间来重构,只要编码过程中进行重构

2、事不过三

3、添加功能的时候,A、为了让代码更容易理解 B、为了更容易添加一些功能,让代码结构更具有弹性

4、修真bug时重构,重构让代码更清晰,更容易发现bug

 

5、代码审核时候重构。有助于团队之间交流知识,经验 ;有助于提供一些有用的思想,建议。重构有助于提供更好的理解,对代码

   一个代码审核者,一个编写者。

 

       难读的程序时不易修改的;有重复逻辑的程序是不易修改的;具有外部逻辑的程序是不易修改的;具有复杂条件逻辑的程序是不易修改的。

 

 

第三章 代码坏味

1、重复代码

a)       同一个类的不同方法中有相同的表达式  --à抽取方法

b)       两个子类中有相同的表达式  --à抽取方法 ---》提升方法

c)       如果两个方法相似   ---》抽取方法抽取相似部分---》形成模板方法  替代算法

d)       如果在两个不相关的子类中有相同的表达式  --》抽取子类 将一个类作为另一个类的组件处理。

 

2、过长方法

写短的方法,并且取一个好的名字;每次当我们需要注释一段代码的时候,就抽取一个方法。

用ReplaceTemp with Query来消除大量的临时变量和参数

用“引入参数对象”和“PreserveWhole Object”来消除长的形参列表

 

最好的重构的方法是 查找“注释”,当需要“注释”的时候,就可以抽取方法 来减小语义上的差距。

 

条件和循环也是常抽取的地方。 使用“压缩条件”

 

3、过长类

当类中的成员变量过多的时候,可以使用“抽取子类”“抽取类”等方法将相关的成员变量抽象成一个类的组件。

 

如果类的方法中 重复代码太多, 可以使用“抽取方法”

如果是GUI类中,注意将类的行为、类的行为分开

 

4、过长形参列表

使用“用方法调用代替参数”、“Preserve Whole Object保持完整对象” “引进参数对象” 等等方法

 

5、发散式变化Divergentchange

当有多种方法来,因为不同的原因改变一个类。使用抽取类的方法

 

6、霰弹式修改Shotgun Surgery   与发散式改变相对     一个改变,改变所有的类  

当你需要在许多不同类中改变小部分东西。  Move Method    Move field Inline Class  来重构

 

7、特性依恋FeatureEnvy

一个方法不在一个处理它的类中,多见于很多getting method调用,使用移动方法、 抽取方法 重构

使用Strategy  Visitor模式

 

8、Data Clumps数据泥团

当两三个数据经常成组出现在类的数据域中、函数声明的参数列中的时候,可以考虑使用Extract Class、  Introduce Parameters Object、Preserve Whole Object方法来消减数据泥团。然后在用移动方法等,将一些方法移动到新的类中间。

 

9 Primitive Obsession基本类型偏执

对基础类型过于依赖。,可以使用Replace Data Value with Object   Replace Type Code with Class  Replace Type Code with Subclasses

 

10 Switch语句

当在一个类的不同地方都见到switch语句的时候,这时候可以考虑使用多态来消除switch类。ReplaceType Code with Subclasses  Replace TypeCode with State/Strategy 

 

11平行继承体系

 

12  Lazy Class 冗余类

13 理论上的一般性Speculative Generality

14 临时字段 temporarychains

15 消息链 Messagechain

16 中间人Middle Man

17 过度亲密InappropriateIntimacy

18 接口不同的等效类

19 不完整类库

20 数据类

21 拒绝继承

22 注释过多



第五章 重构目录

1、  名字

2、  概述 :那些地方需要重构、这个重构时用来做什么的

3、  动机:为什么需要那个重构、应用的状态,那些地方不应该进行重构

4、  做法mechanics : 如何使用该方法重构

5、  样例

 

 

 

第六章 组合方法

6.1 提取方法

       把一段实现相应独立功能的代码,抽取成一个函数。

 

6.2 内联方法

       当一些简短的函数表示动作意图时,但有时候你会遇到某些函数,其内部代码和函数名称同样清晰易读,可以使用此方法重构。

       还有事对拆分的不好的函数,使用内联,然后重新拆分。

 

6.3 内联临时变量

       double  basePrice = anOrder.basePrice();

       return (basePrice > 1000);      

à

       return anOrder.basePrice()>1000;

       通常作为Replacetemp with Query的一部分来使用。

 

6.4 用查询代替临时变量

       由于临时变量只在所属的函数内可见,所以他驱使我们写长的函数。

-à 把临时变量替换为查询式,有利于代码重用。使结构更加清晰。

      

6.5、引入解释性变量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值