任务4:改变函数参数
Last updated
Was this helpful?
Last updated
Was this helpful?
将字符串提炼成为常量,事实上已经消除了“重复代码”的坏味道:现在要修改字符串的值,只需要修改一处地方了。不过,提炼出常量以后,我们又发现一个事情,那就是这个常量本身的值是什么,其实也不重要了——它应该是一个典型的Enum
类型。如果是使用 JavaScript 的同学,可能会发现 JS 中没有枚举Enum
类型,那么至少我们可以把这个常量搬移到类外面。
这节课要做的事,就是:
使用 Java 的同学:把所有字符串常量的引用点,替换对枚举值的处理/引用。
使用 JavaScript 的同学:确保字符串常量搬移到了Length
类的外面。
不过,这一步的任务粒度稍大,请你在开始之前先花 3 分钟思考一下:你将如何重构?你能否做到每写几行代码都能运行测试(而不是全部做完再运行一次测试)?
对于使用 JavaScript 的同学来说,由于 JS 是弱类型,这个任务可能简单一些:你只需要把常量文件从Length
文件内搬移到另一个文件里(如果上一步还没这么做),确保测试全部通过,就可以了。
将字符串常量搬移到Length
类外
注意重构的步子,保持每分钟都要能运行测试
对于 Java 的同学来说,这步任务的粒度就要稍微大一点了,因为 Java 是强类型的语言,要把String
类型的单位字符串替换成不同类型的enum
,需要改动所有地方的函数签名:构造函数、getUnit()
方法,以及setter
方法。
从哪里开始重构呢?如何做到平滑替换呢?如何做到每分钟都能保持测试通过呢?这就是你需要考虑和练习的问题。
将以下所有使用字符串常量的地方替换成枚举类型:
getUnit()
setter 方法
构造函数
parseTo()
/as()
方法
git checkout task-6
看一下参考步骤,找出与你设定步骤的异同
多练几遍
你选择先更换哪个方法的声明?你觉得重构的先后次序有区别吗?
过程中有没有不顺畅的地方?
你还能做到重构过程每分钟都保持运行测试并且测试通过的状态吗?
《重构 2》6.5 改变函数声明(Change Function Declaration)
《重构 2》6.7 变量改名(Rename Variable)