什么是重构?
重构是对软件内部结构的一种调整,目的在不改变软件外部行为的前提下,提高可理解性,降低维护成本。
重构是严谨的、有序的对完成代码进行整理从而减少出错的一种方法。
为何重构?
改进程序设计
提高程序可读性
助你找到错误
助你提高编程速度
助你提高设计和编程水平
何时重构?
新增功能时、修复错误时、review代码时、
何时不重构?
程序太复杂时,,重构不如重写。
项目即将结束时避免重构。
重构与设计
良好的设计是重构的目的。重构弥补设计的不足。
重构使设计方案更简单。在预先设计的时候,只需要提供足够合理的解决方案,在实施的时候对问题会进一步加深,此时可以重构成最佳方案。
重构避免过度设计。
Bad Smell
1. 代码重复(duplicated code) 滥用 copy&paste
重构方案:
重复代码在同一个类中的不同方法中,则直接提炼为一个方法
如果重复代码在两个互为兄弟的子类中,则将重复的代码提到父类中
如果代码类似,则将相同部分构成单独函数,或者用 Template Method 设计模式
重复代码出现在不相干的类中,则将代码提炼成函数或者放在独立的类中
2过长的函数(Long Method)
是面向结构程序开发带来的 “后遗症”,过长的函数降低可读性。
重构方法:
将独立的功能提炼成新函数
3. 过大类(Large Class)
过大的类使得责任不清晰。
重构方法
将过大类的功能拆分成多个功能单一的小类
4 过长的参数列(Long Parameter List)
过长的参数列难以理解,而且容易传错参数。
重构方法:
将参数列表用参数对象替换
5 发散式变化(Divergent Change)
一个类由于不同的原因而被修改。
重构方法:
将类拆分成多个,每个类只因为一种变化而修改
6 霰弹式修改(Shotgun Surgery)
与发散式变化相反,遇到变化时需要修改许多不同的类。
重构方法:
将类似的功能放到一个类中
7 依恋情结(Feature Envy)
函数对某个类的兴趣高过对自己所处的类,通常是为了
重构方法:
将函数部分功能移到它感兴趣的类中取其他类中的数据
8 数据泥团(Data Clumps)
在多个地方看到相同的数据项。例如:
多个类中相同的变量,多个函数中相同的参数列表,并且这些数据总是一起出现
重构方法:
将这些数据项放到独立的类中
9 分支语句(Swtich Statements)
大量的分支、条件语句导致过长的函数,并且可读性差。
重构方法:
应将它变成子类或者使用 State和 Strategy模式
10 过度耦合的消息链(Message Chains)
一个对象请求另一个对象,后者又请求另外的对象,然后继续。。。。,形成耦合的消息链。
重构方法:
公布委托对象供调用
11 过多的注释(Comments)
代码有着长长的注释,但注释之所以多是因为代码很糟糕。
重构方法:
先重构代码,再写上必要的注释
12 夸夸其谈未来性(Speculative Generality)
现在用不到,觉得未来可以用到的代码,要警惕。
重构方法:
将用不上的代码去掉
13 纯粹的数据类(Data Class)
将数据类中数据以Public方式公布,没对数据访问进行保护。
重构方法:
将数据封装起来,提供Get/Set方法