任务3:提取字符串常量

上一节课的重命名应该比较简单,目的是让你慢慢找到一些重构的节奏和感觉。但是简单之中仍然有细节:每做完一次重构,修改了几行代码,你有没有做到及时运行测试,确保测试通过?频繁运行测试、小步前进,这跟 TDD 的精神是一样的:一是为了获得更快的反馈,二是减少出错时的排查范围。

接下来,在开展进一步重构前,我们需要决定下一步重构的目标。这件事可以靠直觉或者经验,也可以做做简单的分析。在继续之前,我想请你花 3 分钟时间阅读一下代码,把对这两个问题的想法写下来:代码里有哪些坏味道/你觉得不好的地方?下一步从哪里开始重构?

如果你对“坏味道”这个词不是很熟悉,那你可以翻开《重构:改善既有代码的设计》一书的第三章通读一遍,里面列举了 24 种常见的坏味道,是用来判断“哪段代码需要重构”的一些建议。

比如说我看到的就有这么几个事情:

  • 表示“单位”的字符串在多处(实现与测试里)出现。这是一种“重复代码(Duplicated Code)”

  • 用于表示英尺的"f"字符串不够表意。这是一种“神秘命名(Mysterious Name)”

  • Length()对象的创建过程也有一些“重复代码”(Duplicated Code)

你可以看到代码里用来描述长度单位的字符串到处都在使用,as()方法里在用,构造函数里在用,getUnit()函数里也在用,这种重复实际上增加了维护的难度。假如你要将其中一个字符串改成另外一个,你得记住修改所有的地方(那个表示英尺的"f",我们看它不顺眼很久了不是吗)。Martin Fowler 在《重构 2》里讲到:“如果你在一个以上的地点看到相同的代码结构,那么可以肯定,设法将它们合而为一,程序会变得更好。”

这节课的任务,让我们先从简单的味道开始:将表示“单位”的字符串提炼到一处地方。

你的任务

Java:

git checkout task-3
./gradlew test

JavaScript:

git checkout task-3
npm test
  1. 提炼parseTo()/as()方法中重复出现的表示“单位长度”的字符串

  2. 使测试代码中硬编码的字符串也引用提炼出来的字符串常量

  3. 修改表示英尺的"f"变量名

  4. git checkout task-4看一下参考步骤

  5. 再多练几次

参考资料

  • 《重构 2》6.3 提炼变量(Extract Variable)

Last updated