买了本《重构》,粗略的看了第一遍,把一些要点记录在印象笔记中了,发出来分享下。
首先是,代码的坏味道:
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