# 重构

# 起因

类似的工作做了三次起,就应该考虑重构了

# 时机

代码复审

# 目的

为了改进程序设计,加快后期新功能开发和修复问题的速度,使代码更可读。

# 标准指标

可读性,易改性

# 场景

代码坏味道:命名无语义、重复代码、函数过长、过长参数列表、全局变量、多处可改数据、发散式变化(改一个功能需改动多处)、霰弹式修改(一个变量可以在多处修改)、依恋情结(模块依赖于其他模块)、数据泥团(同样的数据存储在不同变量中,数据冗余)、基本类型偏执(泛类型,不同类型滥用同一类型)、重复的switch(多个地方使用同样的switch逻辑,应考虑多态)、循环语句(以管道取代循环操作,如map、filter可让我们更清楚返回值)、冗赘的元素(结构上多余的设计)、夸夸其谈通用性(声明目前用不到的函数)、临时字段(声明一个与函数无关的变量)、过长的消息链(通过一个对象获取另一个对象,再向后者获取另一个对象,以此类推)、中间人(过度委托某函数)、内幕交易(俩模块间存在大量交换数据,可另起一个模块存放)、过大的类(万能类)、异曲同工的类(相似可选择性使用的类)、纯数据类(类上无函数,被多个其它类修改着)、被拒绝的遗赠(继承但又不用到超类的函数或数据,此时应以委托取代子类或者以委托取代超类解决)、注释(写注释前先尝试重构)

# 重构方式

  • 提炼函数:以意图为函数名,将某块逻辑抽出
  • 内联函数:将无用间接层移除,并入函数体中
  • 提炼变量:让复杂表达式更清晰
  • 内联变量:当表达式本身足够简易时
  • 改变函数声明:直接修改名称或迁移式修改(先增加一个函数,原函数调用新函数,后期移除原函数)
  • 封装变量:将变量提炼到一个函数中,该函数返回这个变量值(深拷贝)
  • 变量改名
  • 引入参数对象:以对象为参数,可直观地表明数据领域。
  • 函数组合成类:多个关联函数,通过类的实例化得到领域对象,直接调用对象取函数值。
Last Updated: 11/29/2024, 1:40:42 PM