# 任务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）
