任务7:霰弹式修改
Last updated
Was this helpful?
Last updated
Was this helpful?
开始这节课的任务之前,先来审视一下当下代码的状态:
首先,Game
类从 177 行减少到了 124 行,类的成员变量从 10 个减少到了 7 个
其次,我们拥有了一个Player
对象,并将increaseGoldCoins()
、moveForward()
及日志打印等行为搬移到了对象上,方法长度和结构明显直观很多
一开始列出来的坏味道列表,已经大致消除了两项:消灭了许多重复代码,消除了依恋情结
修复了两个 bug
很明显,我们已经比一开始拥有了更好的起点。并且,这一切是建立在我们尚未尝试理解代码的真正结构和行为上的——仅仅靠“识别坏味道”、“消除坏味道”,在此过程不断增加对代码的理解,不断累积小的重构,我们已经能够明显地优化系统的结构。
虽然,Game
类依然有 120 行之多,依然是一个比较大的类,但既然当下比较难看清楚具体的修改方向,不如是时候让我们来看一下这道题一开始的新需求,看看重构以后的代码是不是容易添加这个新特性:
新增两个类别的问题:蓝调(Blues)、历史(History)
注意保证问题分布均匀
注意保证能得到正确类别的题目
怎么样,简单吗?
你可能觉得,也不难,就是要多改几个地方——其实这就是一种坏味道。这里有些霰弹式修改的味道,也有些发散式变化的味道:要新增一个类别的问题,需要修改多处的代码(生成问题的地方、使用问题的地方、保证问题分布的地方),问题类别的字符串需要在多处做出修改。
如果我们发现给程序添加一个新特性不甚容易,此时应该先尝试重构一下代码,使其变得比较容易添加该特性,然后再着手新增特性。
这课的任务,就是先重构一下代码,使得“添加题目类别”这个任务变得简单,简单得只需要改动一行代码。然后再着手添加这两个类别的题目。
Java:
JavaScript:
重构代码,使问题能均匀分布
重构代码,使“新增一个类别的题目”只需要修改 1 行代码
新增 Blues、History 两个类别的题目