重构总结

重构的好处 1 能改进软件设计 2 使软件更容易被理解 3 能帮你找到bug 4 提高软件的开发速度
重构有个三次法则:事不过三,三则重构.意思是说,一件事情,第一次只管去做,第二次做类似的事情会产生反感,但无论如何还是做了,第三次再做类似的事情,你就应该重构.
什么时候应该重构  1 增加一个新的功能之前。2 在修复一个错误的时候。3 在做代码浏览的空闲时间。
什么时候不应该重构
1  代码不能工作了,或者说有些代码没有办法修改了,根本就没有办法让代码保证稳定;这个时候不应该重构。重构至少要保证代码可以正常的工作;重构只能帮助你找BUG,但不能绝对消除BUG。这种情况下,最好重新设计和重写。
2 当你工期接近死期的时候。因为这个时候你重构的效果会在死期之后才能体现,但太晚了。另外一种说法就是,如果你为了功能性而放弃了质量,你的代码存在隐患,你就像负债一样,这些债务在适当的时候要还一还,那个时候使用重构。
重构的分类:
重构的手法中有相当一大部分是双向的、互逆的,也就是说在某种时候是你找我,而在另一些时候是我找你,比如Pull Up Field和Push Down Field,Pull Up Method和Push Down Method等,而另一些则是强调单向的、勇往直前的,比如Encapsulate Field、Remove Control Flag、Remove Parameter、Remove Assignments to Parameters、Replace Conditional with Polymorphism等。
在双向的、护逆的重构手法中,强调的是一种平衡,是职责清晰,角色明确。
而在强调单向的、勇往直前的重构手法中,突出的是使代码更容易理解、更容易扩展,更加具有面向对象性。
采用手法的含义:
1 提炼(Extract):就是对某个过程的一部分,或某个事物的一部分进行抽象并概念化,以减小所表达的目的(要做什么)和实现(做什么,如何做)之间的语义差距。
2 内联(Inline):就是用其直接实现替换原来的间接调用,通过内联可以去掉意义不大的间接性。
3 移动(Move,Pull Up/Down ):在类之间(包括父类和子类之间)移动属性和方法,以使类之间职责更明确更清晰。
4 替换(Replace):将一种实现方式用另一种实现方式替代,以便于更直接更集中和更灵活。
5 改变 (Change):改变和替换语义上有些类似,其间的差别还不是很清楚。
6 其他:包括增加Add、移除Remove、隐藏Hide、引入Introduce、封装Encapsulate、合并Consolidate等等。
Bad Smells分类:
1 The Bloaters(臃肿):臃肿的坏味道表明已经膨胀到无法对之进行有效的处理。包括:Long Method,Large Class,Primitive Obsession,Long Parameter List,DataClumps。
2 The Object-Orientation Abusers(面向对象滥用):表示解决方案没有很好的利用面向对象设计。包括:Switch Statements,Temporary Field,Refused Bequest,Alternative Classes with Different Interfaces。
3 The Change Preventers(同protected variation):阻碍了改变软件或者更进一步开发软件。包括Divergent Change,Shotgun Surgery,Parallel Inheritance Hierarchies。
4 The Dispensables(可省掉的):代表一些没有必要的东西,应该从源代码中移除。包括:Lazy class,Data class,Duplicate Code,Dead Code,Speculative Generality。
5 The Couplers(耦合):与耦合相关的坏味道。包括:Feature Envy,Inappropriate Intimacy,Message Chains,Middle Man。