任务6:修复缺陷

如果你发现isGettingOutOfPenaltyBox变量似乎没法简单消除,尝试直接使用player上的isInPenaltyBox变量时却怎么也会挂掉测试……那就对了。这里其实有个 bug。

我们前面做的重构其实是“帮助理解的重构”。这样的重构并不需要你真正理解代码的逻辑,依靠测试和严格地遵循重构手法,你同样能得到等价的代码,但拥有更好的结构,以帮助你更好地看清代码的意图,进而更容易做出修改。这就像擦去玻璃上的灰尘,往往能使你看见更多的风景。重构之后,有时你便能更容易看见以往难以发现的深层次设计问题——当重构完代码,我们看到这段代码(如此清晰)时,甚至会忍不住惊讶:

    if ( ... ) {
      console.log("Answer was correct!!!!");
      this.setNextPlayer();
      this.getCurrentPlayer().increaseOneGoldCoin();
      return ...;
    }

回答正确的时候先设置了nextPlayer再增加金币,那不就是把金币奖给了下一位玩家吗?没道理啊。

好在这个 bug 的修复方式就跟代码一样直观:看起来调换一下两行代码顺序就可以了。

不过,这里还有另外一个 bug 就没那么简单了:进入惩罚区的玩家不应该再回答问题。

除了要把 bug 修好,你还需要思考一下,发生 bug 的原因是什么,怎么样能在代码层面更好地避免同类问题再发生。

这节课的任务,就是修复一下项目里现存的几个 bug。

你的任务

Java:

git checkout task-6-bugs-fixing
cd java && ./gradlew clean build

JavaScript:

git checkout task-6-bugs-fixing
cd javascript && npm test
  • 修复 bug:金币被奖励给了错误的玩家

  • 修复 bug:进入惩罚区的玩家不应该再回答问题

  • 移除isGettingOutOfPenaltyBox变量

参考资料

  • 《重构 2》2.4 何时重构

Last updated