代码中坏味道和对应重构方法——摘自《重构,改善既有代码的设计》

坏味道1 :重复代码

重构方法:

1)       Extract Method (提炼函数): 你有一段代码可以被组织在一起并独立出来。 将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。

2)       Extract Class (提炼类):某个类做了应该由两个类做的事。建立一个新类, 将相关的字段和函数从旧类搬移到新类。

3)       Pull Up Method (函数上移):有些函数, 在各个子类中产生完全相同的结果。 将该函数移至超类。

4)       Form Template Method(塑造模板函数):你有一些子类, 其中相应的某些函数以相同的顺序执行类似的操作,但各个操作的细节上有所不同。 将这些操作分别放      进独立函数中, 并保持他们都有相同的签名,于是原函数也就变得相同了。 然后将原函数上移至超类。

坏味道2:过长函数

重构方法:

1)       Extract Method (提炼函数): 你有一段代码可以被组织在一起并独立出来。 将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。

2)       Replace Temp with Query (以查询取代临时变量): 你的程序以一个临时变量保存某一表达式的运算结果。将这个表达式提炼到一个独立函数中。 将这个临时变        量的所有引用点替换为对新函数的调用。 此后,新函数就可被其他函数使用。

3)       Replace Method with Method Object(以函数对象取代函数): 你有一个大型函数, 其中对局部变量的使用使你无法采用提炼函数的方法。 将这个函数放进一个单    独的对象中, 如此一来局部变量就成了对象内的字段。然后你可以在同一个对象中将这个大型函数分解为多个小型函数。

4)       Decompose Conditional(分解条件表达式): 你有一个复杂的条件(if-then-else)语句。 从 if、 then、 else 三个段落中分别提炼出独立函数。

坏味道3: 过大的类

重构方法:

1)       Extract Class (提炼类):某个类做了应该由两个类做的事。建立一个新类, 将相关的字段和函数从旧类搬移到新类。

2)       Extract Subclass (提炼子类): 类中的某些特性只被某些(而非全部)实例用到。新建一个子类, 将上面所说的那一部分特性移到子类中。

3)       Extract Interface (提炼接口): 若干客户使用类接口中的同一子集, 或者两个类的接口有部分相同。将相同的子集提炼到一个独立接口中。

4)       Replace Data Value with Object (以对象取代数据值): 你有一个数据项,需要与其他数据和行为一起使用才有意义。将数据项变成类。

坏味道4: 过长参数列

重构方法:

1)       Replace Parameter with Method(以函数取代参数): 对象调用某个函数, 并将所得结果作为参数, 传递给另一个参数。而接受该参数的函数本身也能够调用前一个函数。让参数接受者去除该项参数,并直接调用前一个函数。

2)       Introduce Parameter Object (引入参数对象):某些参数总是很自然的同时出现。 以一个对象取代这些参数。

3)       Preserve Whole Object (保持对象完整): 你从某个对象中取出若干值,将它们作为某一次函数调用时的参数。 改为传递整个对象。

坏味道5:发散式变化

重构方法:

1)       Extract Class (提炼类):某个类做了应该由两个类做的事。建立一个新类, 将相关的字段和函数从旧类搬移到新类。

坏味道 6: 依恋情结

重构方法:

1)       Move Method (搬移函数): 你的程序中, 有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。 在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或者将旧函数完全移除。

2)       Move Field (搬移字段): 你的程序中, 某个字段被其所驻类之外的另一个类更多的用到。在目标类新建一个字段, 修改源字段的所有用户,令它们改用新字段。

3)       Extract Method (提炼函数): 你有一段代码可以被组织在一起并独立出来。 将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。

坏味道7: 散弹式修改

重构方法:

1)       Move Method (搬移函数): 你的程序中, 有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。 在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或者将旧函数完全移除。

2)       Move Field (搬移字段): 你的程序中, 某个字段被其所驻类之外的另一个类更多的用到。在目标类新建一个字段, 修改源字段的所有用户,令它们改用新字段。

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

坏味道8: 数据泥团

重构方法:

1)       Extract Class (提炼类):某个类做了应该由两个类做的事。建立一个新类, 将相关的字段和函数从旧类搬移到新类。

2)       Introduce Parameter Object (引入参数对象):某些参数总是很自然的同时出现。 以一个对象取代这些参数。

3)       Preserve Whole Object (保持对象完整): 你从某个对象中取出若干值,将它们作为某一次函数调用时的参数。 改为传递整个对象。

坏味道9: 基本类型偏执

重构方法:

1)       Replace Data Value with Object (以对象取代数据值): 你有一个数据项,需要与其他数据和行为一起使用才有意义。将数据项变成类。

2)       Extract Class (提炼类):某个类做了应该由两个类做的事。建立一个新类, 将相关的字段和函数从旧类搬移到新类。

3)       Introduce Parameter Object (引入参数对象): 某些参数总是很自然地同时出现。以一个对象取代这些参数。

4)       Replace Array with Object (以对象取代数组): 你有一个数组,其中的元素各自代表不同的东西。以对象替换数组。 对于数组中的每个元素,以一个字段来表示。

5)       Replace Type Code with Class (以类取代类型码): 类之中有一个数值类型码, 但它并不影响类的行为。 以一个新的类替换该数值类型码。

6)       Replace Type Code with Subclasses(以子类取代类型码):你有一个不可变的类型码, 它会影响类的行为。 以子类取代这个类型码。

7)       Replace Type Code with State/Strategy(以State/Strategy 取代类型码): 你有一个类型码, 它会影响类的行为,但你无法通过继承手法消除它。以状态对象取代类型码。

坏味道10:Switch惊悚现身

重构方法:

1)       Replace Conditional with Polymorphisrn (以多态取代条件表达式): 你手上有个条件表达式,它根据对象类型的不同而选择不同的行为。将这个条件表达式的每个分支放进一个子类内的覆写函数中, 然后将原始函数声明为抽象函数。

2)       Replace Type Code with Subclasses(以子类取代类型码):你有一个不可变的类型码, 它会影响类的行为。 以子类取代这个类型码。

3)       Replace Type Code with State/Strategy(以State/Strategy 取代类型码): 你有一个类型码, 它会影响类的行为,但你无法通过继承手法消除它。以状态对象取代类型码。

4)       Replace Parameter with Explicit Methods(以明确函数取代参数): 你有一个函数,其中完全取决于参数值而采取不同行为。针对该参数的每一个可能值,建立一个独立函数。

5)       Introduce Null Object(引入Null 对象): 你需要再三检查某对象是否为null。 将null值替换为null对象。

坏味道11: 冗余类

重构方法:

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

2)       Collapse Hierarchy(折叠继承体系): 超类和子类之间不太大区别。将它们合为一体。

坏味道12: 平行继承体系

重构方法:

1)       Move Method (搬移函数): 你的程序中, 有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。 在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或者将旧函数完全移除。

2)       Move Field (搬移字段): 你的程序中, 某个字段被其所驻类之外的另一个类更多的用到。在目标类新建一个字段, 修改源字段的所有用户,令它们改用新字段。

坏味道13: 夸夸其谈未来性

重构方法:

1)       Collapse Hierarchy(折叠继承体系): 超类和子类之间不太大区别。将它们合为一体。

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

3)       Remove Parameter(移除参数):函数本体不再需要某个参数。 将该参数去除。

4)       Rename Method (函数改名): 函数的名称未能揭示函数的用途。修改函数名称。

坏味道14: 过度耦合的消息链

重构方法:

1)Hide Delegate(隐藏“委托关系”):客户通过一个委托类来调用另一个对象。 在服务类上建立客户所需的所有函数, 用以隐藏委托关系。

坏味道15: 令人迷惑的暂时字段

重构方法:

1)       Extract Class (提炼类):某个类做了应该由两个类做的事。建立一个新类, 将相关的字段和函数从旧类搬移到新类。

2)       Introduce Null Object(引入Null 对象): 你需要再三检查某对象是否为null。 将null值替换为null对象。

坏味道16: 异曲同工的类

重构方法:

1)       Rename Method (函数改名): 函数的名称未能揭示函数的用途。修改函数名称。

2)       Move Method (搬移函数): 你的程序中, 有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。 在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或者将旧函数完全移除。

坏味道17: 狎昵关系

重构方法:

1)       Move Method (搬移函数): 你的程序中, 有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。 在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或者将旧函数完全移除。

2)       Move Field (搬移字段): 你的程序中, 某个字段被其所驻类之外的另一个类更多的用到。在目标类新建一个字段, 修改源字段的所有用户,令它们改用新字段。

3)       Change Bidirectional Association to Unidirectional(将双向关联改为单向关联):两个类之间有双向关联,但其中一个类如今不再需要另一个类的特性。

4)       Replace Inheritance with Delegation (以委托取代继承):某个子类中使用超类接口中的一部分,或是根本不需要继承而来的数据。 在子类中新建一个字段用以保存超类;调整子类函数, 令它改而委托超类;然后去掉两者时间的继承关系。

5)       Hide Delegate(隐藏“委托关系”):客户通过一个委托类来调用另一个对象。 在服务类上建立客户所需的所有函数, 用以隐藏委托关系。

坏味道18: 中间人

重构方法:

1)       Remove Middle Man (移除中间人):某个类做了很多的简单委托动作。让客户直接调用委托类。

2)       Inline Method (内联函数):一个函数的本体与名称同样清楚易懂。 在函数调用点插入函数本体, 然后移除函数。 

3)       Replace Delegation with Inheritance (以继承取代委托):你在两个类之间使用委托关系,并经常为整个接口编写许多极简单的委托函数。 让委托类继承受托类。

坏味道19: 纯稚的数据类

重构方法:

1)       Move Method (搬移函数): 你的程序中, 有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。 在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或者将旧函数完全移除。

2)       Encapsulate Field(封装字段): 你的类中存在一个public 字段。 将它声明为private, 并提供相应的访问函数。

3)       Encapsulate Collection(封装集合): 有个函数返回一个集合。 让这个函数返回该集合中的一个只读副本,并在这个类中提供添加/移除集合元素的函数。

坏味道20: 不完美的库类

重构方法:

1)       Introduce Foreign Method( 引入外加函数):你需要为提供服务的类增加一个函数, 但你无法修改这个类。 在客户类中建立一个函数,并以第一参数形式传入一个服务类实例。

2)       Introduce Local Extension(引入本地扩展):你需要为服务类提供一些额外函数,但你无法修改这个类。 建立一个新类,使它包含这些额外函数。 让这个扩展品成为源类的子类或者包装类。

坏味道21: 过多的注释

重构方法:

1)       Extract Method (提炼函数): 你有一段代码可以被组织在一起并独立出来。 将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。

2)       Introduce Assertion(引入断言): 某一段代码需要对程序状态做出某种假设。以断言明确表现这种假设。

坏味道22: 被拒绝的遗赠

重构方法:

1)       Replace Inheritance with Delegation (以委托取代继承):某个子类中使用超类接口中的一部分,或是根本不需要继承而来的数据。 在子类中新建一个字段用以保存超类;调整子类函数, 令它改而委托超类;然后去掉两者时间的继承关系。


你可能感兴趣的:(代码中坏味道和对应重构方法——摘自《重构,改善既有代码的设计》)