1 重复代码。要将重复的代码提炼出来成小的函数或类供调用,避免重复。因为重复代码是“坏味道”的开始。
2 过长函数、过大的类。将函数或类进行合理的分解,便于代码的阅读。名字很关键,要尽量看名知意。
3 过长参数、数据泥团。对于参数过长可以考虑将参数进行封装成数据对象。数据泥团,对于好多字段经常一起出现,可以考虑将他们封装成数据对象,在一处处理。
4 过多的相同 switch 语句。可以考虑使用多态、state 模式、策略模式 进行避免
state 模式:在对象创建好后对象的类型在处理过程中可以动态变化,往往需要和工厂函数配合使用。并且工厂函数往往只简单的生产对象。
策略模式:客户端代码需要知道确切的对象类型,在处理过程中只会涉及该类型的操作。因此对象的类型创建后不会改变。
5 过度耦合的消息链:对于较少的链式调用可以考虑使用代理模式将需要的方法代理起来。
6 中间人:对于代理类仅仅是代理了被代理类的大部分方法,可以考虑使用继承关系来替换这种代理方式。
7 分解临时变量:程序中有临时变量被赋值超过一次,它既不是循环变量,也不是被用于收集计算结果。可以考虑使用多个变量名赋值,每个变量名有其含义。
8 引入外加函数或引入本地扩展:对于不能获得源码,又想将责任分一部分到该类中。如果添加的功能比较少可以考虑使用引入外加函数解决,即代理的方式。如果添加的功能比较多可以考虑使用本地扩展,即继承方式。
9 以字面常量取代魔数:如果一个常数经常被用到,并且带有特殊意义应该声明一个有意义的字面常量取代。可以提高代码可读性。
10 读取和设置函数职能应分开,读取函数内部不应该改变变量值。对于返回集合的读取函数应该返回一个只读副本。
11 分解条件表达式:当计算条件表达式比较复杂时,可以将计算条件提取到单独一个函数中,便于进行逻辑处理。
12 移除控制标记:当函数中有循环语句,并有多个退出的控制标记。可以考虑使用多出口函数代替。将控制标记处作为一个函数的出口退出函数。
13 多态取代条件表达式:当根据对象类型的不同而选择不同的行为,可以考虑使用多态的方法。如果由于某种原因,重构的类已经有了子类,则需要考虑使用 state 模式或者 策略模式。
14 以工厂函数取代构造函数:当构造函数比较复杂时可以考虑使用工厂函数来构造对象。
15 以异常取代错误码:当一段程序发现错误时,他需要让他的调用者知道这个错误,而调用者也可能将这个错误继续沿着调用链传递上去。
16 字段上移、字段下移,函数上移、函数下移,目的都是将重复代码较少。在继承关系中,多个子类含有共同的函数时,可以考虑降函数上移到父类中。
17 提炼接口:如果多个类都含有一组相同的功能,可以考虑将这几个方法提炼到接口当中。