Duplicated Code重复代码
某些代码重复出现,能够抽象到一个新的函数中,或者抽象到父类上去。
Long Method过长函数
过长函数是指,一个函数里面实现的功能太多,越长也就越难理解。
你须要将一个过长的函数分解成各类小函数,命名是关键。
Data Clumps数据泥团
函数的参数很是的多,调用也频繁,其中一个参数被删掉,其余的参数就不是那么有意义了。
能够把这些参数抽到一个类里面,直接传这个类的对象就行了。
Large Class过大的类
一个类若是作太多的事情,就会致使内部有不少实例变量,重复代码就会出现。
考虑如何把他们分解到小的类上面。
Long Parameter List过长的参数列
一个方法的参数太多会变得很恶心
考虑,若是能够传一个对象给函数,函数能够经过这个对象得到到那些参数
Divergent Change发散式变化
若是须要修改或者添加不一样的功能,须要修改不一样的函数。
考虑如何把它们分到不一样的类里面。
Shotgun Surgery霰弹式修改
若是须要修改或者添加某个功能,须要修改好几个地方
考虑把须要修改的地方集中到一个函数里。
Feature Envy依恋情结
若是某个函数执行的时候调用了另外一个对象的大多数方法。
也许应该把这个方法移动到那个对象里面去。
Primitive Obsession基本类型偏执
将一些基本类型组成的数据抽象成小对象,money啊,phone number之类
Switch Statement switch惊悚现身
减小使用switch,就是少在case里面放太多的代码,只让它作出一个选择返回一个状态,而后具体的操做经过调用对象的函数来实现。
Parallel Inheritance Hierarchies平行继承体系
当你给一个类增长字段的时候,也要给另外一个类增长一样的字段。
解决方法是,让一个继承体系的实例去引用另外一个集成体系的实例。
Lazy Class冗赘类
若是一个类所得不值其身价,就让它消失
Speculative Generality夸夸其谈将来性
没有必要以“考虑到将来某天咱们必定要作这样的事情”为借口作些没必要要的事情。
过多的注释
优良的代码是能够直接看就能明白它的做用,复杂的代码才须要把每一步的做用都详细的说明出来。
接下来是,
重构手法:
Extract Method(提炼函数)
从大方法中提炼出独立的部分,函数的细粒度越小,一是提升了它的复用性,二是它被覆写的时候更容易。
Inline Method(内联函数)
当有时候一个函数过于简短,里面的内容可能就是作一个简单的判断就返回的话,能够考虑去掉这个方法。
Inline Temp(内联临时变量)
把一些经过方法返回的变量换成那句方法的调用(query)。
Replace Temp with Query(以查询取代临时变量)
当某些临时变量只被赋一次值的时候(能够将变量声明为final,而后运行下看看是否只被赋值一次),就将这些临时变量所有换成方法的调用(或者成为query)。
Introduce Explaining Variable(引入解释性变量)
当某些语句很是的复杂,而后返回一个boolean型,而后这条长长的语句直接丢进if里判断,这会致使难以理解,能够引入解释型变量isRight之类的,将这些变量放入if中会比较好理解。
Replace Data Value with Object(以对象取代数据值)
有些数据,好比电话号码,若是仅仅用一个字符串存储可能之后操做会很是困难,它可能须要多种显示的形式,因此把看似简单的数据包装成对象会方便之后的操做。
Encapsulate Field(封装字段)
将public的字段改为private,并提供setter和getter