> For the complete documentation index, see [llms.txt](https://ethan-lin.gitbook.io/refactoring/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ethan-lin.gitbook.io/refactoring/bugszero/8-task-6.md).

# 任务6：修复缺陷

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

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

```javascript
    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 何时重构
