任务5:再撸一遍

知道了原理,这节课的任务是温故。我将心法与“改变函数声明”这个手法提炼成了下面几个步骤,它的核心只有一个,就是在重构的同时保持旧方法依旧可用。你可以尝试按照这个步骤把这个重命名的过程继续操练几遍。

Java 版

任务:替换parseTo(String unit)(或者分支里已经重命名过的as()方法)的方法签名为parseTo(Unit target)

1. 对整个旧方法体应用“提炼函数”,并给新方法一个临时的名字,可以是`temp_as()` / `_as()` / `myName_as()`等,关键是回头容易搜索
2. 运行测试
3. 使旧方法直接转调新方法
4. 运行测试 [旧的不变]
5. 在新方法上新增一个参数,新参数如果暂时没有好的命名,可以取一个容易搜索的名字以便后面替换(比如`temp_unit`, `uuuunit`,`my_unit`等),并在旧方法上传入新参数
6. 运行测试
7. 在旧方法中将`String unit`值转换为正确的`Unit temp_unit`值,可以小步地一次只替换一个值(如`YARD`或`INCH`)
8. 运行测试 [新的创建]
9. 查找原函数的引用点
10. 逐一替换每个引用点,令它们使用新参数调用新方法 [一步切换]
11. 每次替换之后运行测试
12. 重复 7-11,直到所有替换完成,`String unit`变量不再被使用为止
13. 删除旧方法 [旧的再见]
14. 运行测试
15. 移除新方法上没用的参数、必要时改回原来的名字(如由`temp_as(..., Unit temp_unit)`改回`as(Unit unit)`)
16. 运行测试
17. 所有测试通过,完成替换

JavaScript 版

任务:利用“十六字心法”完成“任务 3:提取字符串常量”一课中的字符串提炼。

1. 选定一个硬编码的字符串(` "inch"``"f"``"yard" `任一),对其应用“提炼字段”,提炼成为`Length`类的静态字符
2. 运行测试 [旧的不变,新的创建]
3. 查找该字符串在实现文件中的引用点
4. 逐一替换每个引用点,令它们引用类上的新变量
5. 运行测试
6. 查找该字符串在测试文件中的引用点
7. 逐一替换每个引用点,令它们引用类上的新变量
8. 运行测试
9. 重复 1-7,直到将所有字符串常量都收缩到`Length`类的静态常量上去 [一步切换]
10. 无旧方法删除 [旧的再见]
11. 运行测试
12. 所有测试通过,完成替换

你的任务

Java:

git checkout task-2
./gradlew test

JavaScript:

git checkout task-3
npm test
  1. 严格遵循上面的重构手法再做一遍重构。

  2. 练习 3 遍,直到能够每半分钟都运行一次测试

思考

  • 注意体会“旧的不变、新的创建”这个创建重构中间状态的过程

  • 重构的过程有没有更加顺畅?

  • 重构的次序能不能进一步优化?

参考资料

  • 《重构 2》6.5 改变函数声明(Change Function Declaration)

  • 《重构 2》6.7 变量改名(Rename Variable)

Last updated