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