任务3:提取字符串常量
Last updated
Was this helpful?
Last updated
Was this helpful?
上一节课的重命名应该比较简单,目的是让你慢慢找到一些重构的节奏和感觉。但是简单之中仍然有细节:每做完一次重构,修改了几行代码,你有没有做到及时运行测试,确保测试通过?频繁运行测试、小步前进,这跟 TDD 的精神是一样的:一是为了获得更快的反馈,二是减少出错时的排查范围。
接下来,在开展进一步重构前,我们需要决定下一步重构的目标。这件事可以靠直觉或者经验,也可以做做简单的分析。在继续之前,我想请你花 3 分钟时间阅读一下代码,把对这两个问题的想法写下来:代码里有哪些坏味道/你觉得不好的地方?下一步从哪里开始重构?
如果你对“坏味道”这个词不是很熟悉,那你可以翻开《重构:改善既有代码的设计》一书的第三章通读一遍,里面列举了 24 种常见的坏味道,是用来判断“哪段代码需要重构”的一些建议。
比如说我看到的就有这么几个事情:
表示“单位”的字符串在多处(实现与测试里)出现。这是一种“重复代码(Duplicated Code)”
用于表示英尺的"f"
字符串不够表意。这是一种“神秘命名(Mysterious Name)”
Length()
对象的创建过程也有一些“重复代码”(Duplicated Code)
你可以看到代码里用来描述长度单位的字符串到处都在使用,as()
方法里在用,构造函数里在用,getUnit()
函数里也在用,这种重复实际上增加了维护的难度。假如你要将其中一个字符串改成另外一个,你得记住修改所有的地方(那个表示英尺的"f"
,我们看它不顺眼很久了不是吗)。Martin Fowler 在《重构 2》里讲到:“如果你在一个以上的地点看到相同的代码结构,那么可以肯定,设法将它们合而为一,程序会变得更好。”
这节课的任务,让我们先从简单的味道开始:将表示“单位”的字符串提炼到一处地方。
Java:
JavaScript:
提炼parseTo()
/as()
方法中重复出现的表示“单位长度”的字符串
使测试代码中硬编码的字符串也引用提炼出来的字符串常量
修改表示英尺的"f"
变量名
git checkout task-4
看一下参考步骤
再多练几次
《重构 2》6.3 提炼变量(Extract Variable)