重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性。降低其修改成本。
重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。
一、重构,第一个案例
如果你发现自己需要为程序添加一个特性,而代码结构使你无法很方便地达成目的,那就先重构那个程序,使特性的添加比较容易进行,然后再添加特性。
重构前,先检查自己是否有一套可靠的测试机制。这些测试必须有自我检验能力。
进行重构的时候,我们需要依赖测试,让它告诉我们是否引入了bug。好的测试是重构的根本。
重构步骤的本质:重构技术就是以微小的步伐修改程序。如果你犯下错误,很容易便可发现它。
任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。
二、重构原则
为何重构:1、重构改进软件设计;2、重构使软件更容易理解;3、重构帮助找到bug;4、重构提高编程速度;
何时重构:1、三次法则(事不过三,三则重构);2、添加功能时重构;3、修补错误时重构;4、复审代码时重构;
间接层是把双刃剑,间接层的价值:1、允许逻辑共享;2、分开解释意图和实现;3、隔离变化;4、封装条件逻辑;
三、代码的坏味道
1、重复代码(Duplicated Code)
2、过长函数(Long Method)
3、过大的类(Large Class)
4、过长参数列(Long Parameter List)
5、发散式变化(Divergent Change)
6、散弹式修改(Shotgun Surgery)
7、依恋情节(Feature Envy)
8、数据泥团(Data Clumps)
9、基本类型偏执(Primitive Obsession)
10、switch惊悚现身(Switch Statements)
11、平行继承体系(Parallel Inheritance Hierarchies)
12、冗赘类(Lazy Class)
13、夸夸其谈未来性(Speculative Generality)
14、令人迷惑的暂时字段(Temporary Field)
15、过度耦合的消息链(Message Chains)
16、中间人(Middle Man)
17、狎昵关系(Inappropriate Intimacy)
18、异曲同工的类(Alternative Classes with Different Interfaces)
19、不完美的库类(Incomplete Library Class)
20、纯稚的数据类(Data Class)
21、被拒绝的遗赠(Refused Bequest)
22、过多的注释(Comments):当你感觉需要撰写注释时,请先尝试重构,试着让所有注释都变得多余。