该笔记不适合人类舒适地阅读
重构第一步:有一套可靠的测试集,可以借助测试框架配置好这些测试,否则就得耗费大把时间来回比对,降低开发速度。重构精髓:小步修改,每次修改后就运行测试。
重构手法
- 提炼函数
- 以查询取代临时变量
- 从赋值表达式的右边提炼一个函数来
- 内联变量
- 改变函数声明
- 拆分循环
- 以多态取代条件表达式
- 以管道取代循环
何时重构
- 由经济利益驱动,让添加功能更快,修复bug更快
- 预备性重构:让添加新功能更容易
- 帮助理解的重构:使代码更易懂
- 在思考这段代码到底在做什么时,自问能不能重构,令其一目了然
- 捡垃圾式重构
- 已经理解代码在做什么,但发现它做得不好
代码的坏味道
- 神秘命名
读侦探小说时,透过一些神秘的文字猜测故事情节是一种很棒的体验:但如果是阅读代码,这样的体验就不怎么好了。
- 重复代码
- 过长函数
方法:提炼函数、以查询取代临时变量、引入参数对象、保持对象完整、以命令取代函数
- 过长参数列表
- 全局数据
- 可变数据
可以用封装变量来确保所有的数据更新操作都是通过很少几个函数来进行,更易监控和演进。尽量把逻辑从处理更新操作的代码中搬移出来。将查询函数和修改函数分离。
- 发散式变化、霰弹式修改
一旦需要修改,应该只在代码该块处做修改,不应改了一个必须要改其他的几个
- 依恋情结
一个函数跟另外一个模块的函数数据交流频繁,远胜于自己的模块内部交流
- 数据泥团
总是绑在一起出现的数据
- 基本类型偏执
把钱、坐标、范围等当作普通数字,电话号码当作字符串
- 封装变量
如果变量的作用域不止于单个函数,就用get set函数封装
- 变换函数
如果变换函数返回的本质是原来对象上添加了更多的信息,用enrich命名。如果它生成的是跟原来完全不同的对象,就用transform命名,