# 重构
# 起因
类似的工作做了三次起,就应该考虑重构了
# 时机
代码复审
# 目的
为了改进程序设计,加快后期新功能开发和修复问题的速度,使代码更可读。
# 标准指标
可读性,易改性
# 场景
代码坏味道:命名无语义、重复代码、函数过长、过长参数列表、全局变量、多处可改数据、发散式变化(改一个功能需改动多处)、霰弹式修改(一个变量可以在多处修改)、依恋情结(模块依赖于其他模块)、数据泥团(同样的数据存储在不同变量中,数据冗余)、基本类型偏执(泛类型,不同类型滥用同一类型)、重复的switch(多个地方使用同样的switch逻辑,应考虑多态)、循环语句(以管道取代循环操作,如map、filter可让我们更清楚返回值)、冗赘的元素(结构上多余的设计)、夸夸其谈通用性(声明目前用不到的函数)、临时字段(声明一个与函数无关的变量)、过长的消息链(通过一个对象获取另一个对象,再向后者获取另一个对象,以此类推)、中间人(过度委托某函数)、内幕交易(俩模块间存在大量交换数据,可另起一个模块存放)、过大的类(万能类)、异曲同工的类(相似可选择性使用的类)、纯数据类(类上无函数,被多个其它类修改着)、被拒绝的遗赠(继承但又不用到超类的函数或数据,此时应以委托取代子类或者以委托取代超类解决)、注释(写注释前先尝试重构)
# 重构方式
- 提炼函数:以意图为函数名,将某块逻辑抽出
- 内联函数:将无用间接层移除,并入函数体中
- 提炼变量:让复杂表达式更清晰
- 内联变量:当表达式本身足够简易时
- 改变函数声明:直接修改名称或迁移式修改(先增加一个函数,原函数调用新函数,后期移除原函数)
- 封装变量:将变量提炼到一个函数中,该函数返回这个变量值(深拷贝)
- 变量改名
- 引入参数对象:以对象为参数,可直观地表明数据领域。
- 函数组合成类:多个关联函数,通过类的实例化得到领域对象,直接调用对象取函数值。