任务7:霰弹式修改

开始这节课的任务之前,先来审视一下当下代码的状态:

  • 首先,Game类从 177 行减少到了 124 行,类的成员变量从 10 个减少到了 7 个

  • 其次,我们拥有了一个Player对象,并将increaseGoldCoins()moveForward()及日志打印等行为搬移到了对象上,方法长度和结构明显直观很多

  • 一开始列出来的坏味道列表,已经大致消除了两项:消灭了许多重复代码,消除了依恋情结

  • 修复了两个 bug

很明显,我们已经比一开始拥有了更好的起点。并且,这一切是建立在我们尚未尝试理解代码的真正结构和行为上的——仅仅靠“识别坏味道”、“消除坏味道”,在此过程不断增加对代码的理解,不断累积小的重构,我们已经能够明显地优化系统的结构。

虽然,Game类依然有 120 行之多,依然是一个比较大的类,但既然当下比较难看清楚具体的修改方向,不如是时候让我们来看一下这道题一开始的新需求,看看重构以后的代码是不是容易添加这个新特性:

新增两个类别的问题:蓝调(Blues)、历史(History)

  • 注意保证问题分布均匀

  • 注意保证能得到正确类别的题目

怎么样,简单吗?

你可能觉得,也不难,就是要多改几个地方——其实这就是一种坏味道。这里有些霰弹式修改的味道,也有些发散式变化的味道:要新增一个类别的问题,需要修改多处的代码(生成问题的地方、使用问题的地方、保证问题分布的地方),问题类别的字符串需要在多处做出修改。

如果我们发现给程序添加一个新特性不甚容易,此时应该先尝试重构一下代码,使其变得比较容易添加该特性,然后再着手新增特性。

这课的任务,就是先重构一下代码,使得“添加题目类别”这个任务变得简单,简单得只需要改动一行代码。然后再着手添加这两个类别的题目。

你的任务

Java:

git checkout task-7-shotgun-surgery
cd java && ./gradlew clean build

JavaScript:

git checkout task-7-shotgun-surgery
cd javascript && npm test
  • 重构代码,使问题能均匀分布

  • 重构代码,使“新增一个类别的题目”只需要修改 1 行代码

  • 新增 Blues、History 两个类别的题目

Last updated