代码重构
一、哪些是需要重构的代码?
二、编写自动化测试代码,构筑一套测试体系
既要测试正常路径,又要测试边界条件:比如数组为空时,数字为0时,数字为负数时等等
三、重构名录
提炼函数
- what:
理解部分代码作用,并提炼到一个独立的函数之中,以这段代码的作用命名
- when :
将意图(干什么)与实现(怎么干的)分开:当一段代码需要花费一段时间去弄清它是干什么的,就提炼它
how :
建议: 短函数(6行以下),可以放在源函数中就放入原函数中,函数名字很重要
- what:
内联函数
- what:
将两个或两个以上的(意图清晰明显的)函数,合并在一起
- when :
当两个或两个以上的函数存在非必要的间接性时,当有一堆组织不合理的小函数时,可以先全部内联到一个函数中,再拆分
how : >
- what:
提炼变量
- what:
将复杂的表达式等提炼成局部变量,变量名很重要
- when :
当表达式非常复杂而难以阅读时,
how : >
- what:
内联变量
- what: >
- when :
当变量名没有表达式表达得更直接时,直接用表达式替换变量
how : >
改变函数声明
- what: >
- when :
当一个函数名并不能很好表达作用时,需要改变它
how : >
封装变量
- what: >
- when :
想要搬移一处被广泛使用的数据
how :
往往先以函数形式封装所有对该数据的访问,可以将重新组织数据转化为重新组织函数,数据的作用域越大,封装就越重要。提高代码的不可变性。全局对象变量,提取时返回该数据的一份副本(Object.assign || 构造函数)
变量改名
- what: >
- when : >
how : >
引入参数对象
- what:
将一组参数数据组织成一个数据结构
- when : >
how : >
- what:
函数组合成类
- what:
将一组操作同一块数据的函数组建成一个类
- when : >
how : >
- what:
函数组合成变换
- what: >
- when : >
- how : >
拆分阶段
- what: >
- when : >
- how : >
封装记录
- what: >
- when : >
how : >
封装集合
- what: >
- when : >
how : >
以对象取代基本类型
- what: >
- when : >
how : >
以查询取代临时变量
- what: >
- when : >
how : >
提炼类
- what: >
- when : >
how : >
内联类
- what: >
- when : >
how : >
隐藏委托关系
- what: >
- when : >
how : >
移除中间人
- what: >
- when : >
how : >
替换算法
- what: >
- when : >
how : >
- 搬移函数
- 搬移字段
- 搬移语句到函数
- 搬移语句到调用者
- 以函数调用取代内联代码
- 移动语句
- 拆分循环
- 以管道取代循环
- 移除死代码
拆分变量
拆分变量
- 字段改名
- 以查询取代派生变量
- 将引用对象改为值对象
将值对象改为引用对象
分解条件表达式
- 合并条件表达式
- 以卫语句取代嵌套条件表达式
- 以多态取代条件表达式
- 引入特例
引入断言
将查询函数与修改函数分离
- 函数参数化
- 移除标记参数
- 以查询取代参数
- 以参数取代查询
- 移除设值函数
- 以工厂函数取代构造函数
- 以命令取代函数
以函数取代命令
函数上移
- 字段上移
- 构造函数本体上移
- 函数下移
- 字段下移
- 以子类取代类型码
- 移除子类
- 提炼超类
- 折叠继承体系
- 以委托取代子类
- 以委托取代超类