坏味道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 (以委托取代继承):某个子类中使用超类接口中的一部分,或是根本不需要继承而来的数据。 在子类中新建一个字段用以保存超类;调整子类函数, 令它改而委托超类;然后去掉两者时间的继承关系。