重构名录

这是我在查看关于重构资料时,结合自己的项目经验整理的关于重构的文档,一共有72个重构技法

在实际开发过程中,可以借鉴

重构名录

1. Extract Method:从一个过长函数中提取一些小的函数以减少原来函数的体积

2. Inline Method:正好相反,将一个函数调用动作替换为该函数本体。

3. Replace Method with Method Object:把方法提炼出来成为一个单一的类。

4. Replace Temp with Query:程序以一个临时变量(temp)保存某一表达式的运算结果。将这个表达式提炼到一个独立的函数(即所谓的查询式Query中).我们常常使用临时变量保存循环中的累加信息,在这种情况下,整个循环可以被提炼为一个独立函数。

5. Introduce Explaining Variable:你有一个复杂的表达式,将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途。

6. Split Temporary Variable(剖解临时变量):程序有某个临时变量被赋值超过一次,它既不是循环变量,也不是一个集用临时变量,针对每次赋值,创造一个独立的,对应的临时变量、

7. Remove Assignments to Parameters:程序中对一个参数进行赋值动作,以一个临时变量取代该参数的位置。

8. Replace Method with Method Object:有一个大型函数,其中对局部变量的使用,使你无法采用Extract Method,将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的值域,然后就可以在同一个对象中将这个大型函数分解为数个小型函数。

9. Substitute Algorithm:替换算法。想要把某个算法替换为另一个更清晰的算法。将函数体替换成别一个算法。

10.      Move Method:搬移函数,在程序中,有个函数与期其所驻class之外的另一个class进行更多交流,调用后者,或被后者调用。就把这个函数搬移到后者之中去。

11.      Move Field在程序中,某个field被其所驻class之外的另一个class更多地用到。

12.      Extract Class:建立一个新Class,将相关的值域和函数从旧class搬移到新class

13.      Inline Class:将类内联化。某个类没有做太多的事情,将class的所有特性搬移到另一个class中,然后移除原class

14.      Hide Delegate:隐藏委托关系。客户直接调用其server object(服务对象)delegate class。在server端(某个class)建立客户所需的所有函数,用以隐藏委托关系(delegation);

15.      Remove Middle Man(移除中间人):某个class做了过多简单委托动作(simple delegation,让客户直接调用delegate(受托类)。这个重构方法与“Hide Delegate”基本上是相反的。

16.      Introduce Foreign Method(引入外加函数):你所使用的server class需要一个额外函数,但你无法修改这个class。在client class中建立一个函数,并以一个server class实体作为第一个引数(argument)。

17.      Introduce Local Extension(引入本地扩展):你所使用的server class需要一些额外函数,但你无法修改这个类。建立一个新class,使它包含这些额外函数。让这个扩展品成为source classsubclass(子类)或(外覆类)。它和“Introduce Foreign Method”重构方法的区别是:前者是通过委托关系调用另一个类的方法,而它是通过一个继承类来达到调用其它类方法的目的。

18.      Self Encapsulate Field(自封装值域):你直接访问一个值域(field,但与值域之间的耦合关系逐渐变得笨拙。为这个值域建立get/set方法,并且只以这些函数来访问值域。

19.      Replace Date Value with Object(以对象取代数据值):你有一笔数据项(data item,需要额外的数据和行为。将这笔数据项变成一个对象。

20.      Change Value to Reference(将实值对象改为引用对象):你有一个class,衍生出许多相等实体(equal instances),你希望将它们替换为单一对象。将这个value object(实值对象)变成一个reference object(引用对象)

21.      Change Reference to Value(将引用对象改为实值对象):你有一个reference object(引用对象),很小而且不可变(immutable,而且不易管理。将它变成一个value object(实值对象)。要把一个reference object变成value object。关键动作是:检查它是否为immutable(不可变)。如果不是,就不能使用本项重构。

22.      Replace Array with Object(以对象取代数组):你有一个数组(array),其中的元素各自代表不同的东西。以对象替换数组。对于数组中的每个元素,以一个值域表示之。

23.      Duplicate Observed Date(复制被监视数据)有一些domain date置身于GUI控件中,而domain method 需要访问之。将该笔数据拷贝到一个domain object中。建立一个Observer模式,用以对domain objectGUI object内的重复数据进行同步控制。

24.      Change Unidirectional Association to Bidirectional(将单向关联改为双向):两个classes都需要使用对方特性,但其间只有一条单向连接(one-way link)。添加一个反向指针,并使修改函数(modifiers)能够同时更新两条连接。

25.      Change Bidirectional Association to Unidirectional(将双向关联改为单向关联):两个classes之间有双向关联,但其中一个class如今不再需要另一个class的特性。去除不必要的关联(association)。

26.      Replace Magic Number with Symbolic Constant(以符号常量/字面常量取代魔法数):你有一个字面数值(literal number),带有特别含义。创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量。

27.      Encapsulate Field(封装值域):你的class中存在一个public 值域。将它声明为private,并提供相应的访问函数。

28.      Encapsulate Collection(封装群集):有个函数(method)返回一个群集(collection)。让这个函数返回该群集的一个只读映件(read-only-view,并在这个class中提供(添加/移除)群集元素的函数。

29.      Replace Record with Date Class(以数据类取代记录):你需要面对传统编程环境中的record structure(记录结构)。为该record(记录)创建一个“哑”数据对象。这个重构方法类似于“Replace Array with Object”。

30.      Replace Type Code with Class(以类取代型别码)class之中有一个数值型别码(numeric type code,但它并不影响class的行为。以一个新的class替换该数值型别码(type code)。

31.      Replace Type Code with Subclasses(以子类取代型别码):你有一个不可变的(immutabletype code,它会影响class的行为。以一个subclass取代这个type code

32.      Replace Type Code with State/Strategy(State/Strategy取代型别码):你有一个type code,它会影响class的行为,但你无法使用subclassing。以state object(专门用来描述状态的对象)取代type code

33.      Replace Subclass with Fields(以值域取代子类):你的各个subclasses的唯一差别只在返回常量数据的函数身上。修改这些函数,使它们返回superclass中的某个(新增)值域,然后销毁subclasses

34.      Decompose Conditional(分解条件式):有一个复杂条件(if-then-else)语句。从if,then,else三个段落中分别提炼出独立函数。然后再调用:

35.      Consolidate Conditional Expression(合并条件式):有一系列条件测试,都得到相同的结果,将这些测试合并为一个条件式,并将这个条件式提炼成为一个独立函数。

36.      Consolidate Duplicate Conditional Fragments(合并重复的条件片段):在条件式的每一个分支上有着相同的一段代码,将这段重复代码搬移到条件式之外。

37.      Remove ControlFlag(移除控制标记):在一系列布尔表达式中,某个变量带有控制标记的作用。以break语句或return语句取代控制标记。把上面这段代码改成:

38.      Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件式)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值