重构第一步,构造可靠的测试环境。
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 平行继承
在为某个类增加子杯,也必须为另一个类增加子类。