首页 > 代码库 > 重构-----改善既有代码的设计

重构-----改善既有代码的设计


1重构原则

1.1 定义:

  1).调整软件内部结构,目的是在不改变软件软件可查行为前提下,提高其可理解性,降低其修改成本。

  2).使用一系列重构准则,在不改变软件可查行为前提下,调整其结构

1.2 何时重构

   1).三次法则

   2).添加功能时

   3).修补错误时

   4).复审代码时

1.3 何时不该重构

   1).代码太乱,重构效率低于重写效率时

   2).项目接近期限时停止重构

2.代码的坏味道

2.1 Duplicated Code

2.2 Long Method

2.3 Large Class

2.4 Long Parameter List

2.5 Divergent Change

   既因为某些原因,需要不断的重复修改已有函数

2.6 Shotgun Surgery

   既因一种变化,需要很多小的修改,且难以找到,将他们整合到一个类中

2.7 Feature Envy

   既函数需要调用其它类中的取值函数多于本类中的函数时,将该函数移至该去的地方。

2.8 Data Clumps

   既多个地方看到相同的三四笔数据项,在两个类内的值域相同,将这些数据提取到新的对象中

2.9 Primitive Obsession

 

2.10 Switch Statements

  既少用switchcase语句,用多态去替代

2.11 Parallel Inheritance Hierarchies

既每当为一个类增加一个子类时,必须也为另一个类增加相应的子类,让一个继承体系的实体(参考,引用,refer to)另一个体系的实体。

2.12 Lazy Class

    既对于没有体现其价值的类来说,可用innerClass替代

2.13 Speculative Generality

2.14 Temporary Field

    如果class中有一个复杂算法,需要好几个变量,应该把与算法有关的提取到独立的class中。

2.15 Message Chains

    既对象之间互相依赖索求

2.16 Middle Man

2.17 Inappropriate Intimacy

    既如果两个classes过于亲密,花费太多时间去探究彼此的private成份,请拆分他们,降低耦合度。

2.18 Alternative Classes with Different Interfaces

    既两个函数做同一件事,却有着不同的签名,重命名并协调他们到一致为止。

2.19 Incomplete Library Class

   

2.20 Data Class

1)移除该移除的set方法

2)getset方法尽量搬到该类来

2.21 Refused Bequest

    subclass复用了superclass的行为实现,却又不愿意支持superclass的接口

2.22 Comments

    既过多的注释

3.构筑测试体系

4.重构名录

4.1 重构的记录格式

   Name

   Summer

   Motivation

   Mechanics

   Example

4.2 寻找引用点

5.重新组织你的函数

5.1 Extract Method

   大函数小化,精准函数名称和函数本体之间的语义距离。

5.2 Inline Method

   在函数调用点插入函数本体,然后移除该函数

5.3 Inline Temp

5.4 Replace Temp with Query

   提炼表达式为新函数,将所有引用点替换为对新的函数的调用,

5.5 Intruduce Explaining Variable

   将复杂函数表达式放到临时变量中,以此表达式名称来解释表达式的用途。

5.6 Split Temporay Variable

   针对每次赋值,创造一个独立的、对应的临时变量。

5.7 Remove Assignments to Parameters

   以一个临时变量,取代参数的位置。

5.8 Replace Method with Method Object

   将大型函数放入一个单独的对象,如此一来局部变量就成了对象的值域。然后你可以在同一个对象中将这个大型函数分解为数个小型函数。

5.9 Substitute Algorithm

   将函数本体替换为另一个算法

6.在对象之间搬移特性

6.1 Move Method

   你的程序中,有个函数与其所驻class之外的另一个class进行更多交流:调用后者或被后者调用。

6.2 Move Field

6.3 Extract Class

6.4 Inline Class

6.5 Hide Delegate

server(某个class)建立客户所需的所有函数,用以隐藏委托关系。

6.6 Remove Middle Man

6.7 Introduce Foreign Method

6.8 Introduce Local Extension

 

7.重新组织数据

7.1 Self Encapsulate Field

7.2 Replace Data Value with Object

7.3 Change Value to Referrence

7.4 Change Referrence to Value

7.5 Replace Array with Object

7.6 Duplicate Observed Data

7.7 Change Unidirectional Association to Bidirectional

7.8 Change Bidirectional to Unidirectional Association

7.9 Replace Magic Number with Symbolic Constant

7.10 Encapsulate Field

7.11 Encapsulate Collection

7.12 Replace Record with Data Class

7.13 Replace Type Code with Class

7.14 Replace Type Code with Subclasses

7.15 Replace Type Code with State/Stratgy

7.16 Replace Subclass with Field

8.简化条件表达式

8.1 Docompose Conditional

ifthen else 三个段落中分别提取独立的表达式

8.2 Consolidate Conditional Expression

8.3 Consolidate Duplicate Conditional Fragments

8.4 Remove ControlFlag

8.5 Replace Nested Conditional with Guard

8.6 Introduce Null Object

   null value 替换为 null object

8.7 Introduce Assertion

9.简化函数调用

9.1 Rename Method

9.2 Add Parameter

9.3 Remove Paremeter

9.4 Separate Query from Modifier

9.5 Param enterize Method

9.6 Replace Parameter with Explicit Methods

9.7 Preserve Whole Object

9.8 Replace Parameter with Methods

9.9 Introduce Parameter Object

9.10 Remove Setting Methods

9.11 Hide Method

9.12 Replace Constructor with Factory Method

9.13 Encapsulate Downcast

9.14 Repalce Error Code with Exception

9.15 Replace Exception with Test

10.处理概括关系

10.1 Pull Up Field

10.2 Pull Up Method

10.3 Pull Up Constractor Body

10.4 Push Down Method

10.5 Push Down Field

10.6 Extract Subclass

10.7 Extract SuperClass

10.8 Extract Interface

10.9 Collapse Hierarchy

10.10 From Template Method

10.11 Replace Inheritance with Delegation

10.12 Replace Delegation with Inheritance

 

11.大型重构

12.重构,复用与实现

14.重构工具

15.集成

 

 上午1:29:57

重构-----改善既有代码的设计