重构第一步,构造可靠的测试环境。

What

任何可以立即查阅的东西,都故意不去记忆。

什么是重构

重构,对软件内部结构调整,在不改变外部可观察行为的前提下,提高其可理解性,减低修改成本。

重构难题

对于修改接口,能获取所有调用者,那么可以安心修改。如果无法修改全部调用者,如果是公开已经发布的接口,就需要同时维护新旧两个接口,直到所有用户将该变化做出反应。

How

Duplicated Code

重复代码提炼。兄弟类,则推到 super class,如果是不完全相同的,则分解方法提炼统一的方法。

Long method

小函数准确的命名,积极地分解长函数。每当需要注释来说明,就应该把需要说明的内容写入独立函数,以其用途命名。

Large Class

如果类内部变量有相同的前缀和后缀,可能可以将其提炼到某个组件。

Long Parameter List

参数列表不应该过长,对象传递。

Divergent Change

类在不同方向上发生变化,针对外界发生的变化所有的修改都只发生在单一类中,需要找出特定原因造成的修改,将其提炼到另一个类中。

Shotgun Surgery

每次遇到某种变化,需要在不同的类内部做修改,这时候需要用 Move Method 和 Move Field 将所需要修改的代码放到同一个类中,如果没有合适的类,就创造一个。

Divergent Change 是“一个类受多种变化影响”,Shotgun Surgery 是“一种变化引发多个类修改”。

Feature Envy

面向对象的技术要点在于,这是一种“将数据和对数据的操作行为包装在一起”的技术。函数对某个类的兴趣超过了对自己所处类的兴趣,这种问题的焦点便是数据。比如某个函数为了计算某个值,从另一个对象调用半打取值函数,解法,将这个函数移动到另外的地方。

Data Clumps

数据泥团,数据项成群结队在一起。

Primitive Obsession

对象打破了基本数据和体积较大的类的界限。

Switch Statements

switch 用多态来代替

Parallel Inheritance Hierarchies 平行继承

在为某个类增加子杯,也必须为另一个类增加子类。

Lazy Class