---
# System prepended metadata

title: 'リファクタリング失敗によるバグの話: forの条件式がややこしいから変数抽出したことにより更新されない問題'

---

# リファクタリング失敗によるバグの話: forの条件式がややこしいから変数抽出したことにより更新されない問題

「forの条件式がややこしいから変数に抽出しよ！」と機械的にやった結果、条件が更新されないというバグを仕込みました。


## 元コードのイメージ
```go=
for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() {
    // ...
}
```

## リファクタリングが失敗する流れ; どう考えたか？
「んー、条件が2つあるし、それぞれの意味が曖昧だなぁ」
「ひとまずリファクタリング(変数抽出)してみるかー」 

↑
いつものクセなので、0秒で判断している。

```go=
cond1 := !p.peekTokenIs(token.SEMICOLON) // ◯◯という意味で...
cond2 := precedence < p.peekPrecedence() // ◯◯という意味で...

// 一生更新されない！！！
for cond1 && cond2 {
    // ...
}
```

「お、わかりやすくなったぞ〜」  ← **実は、リファクタリング失敗！**


## なぜ気づけたか？
テストをちゃんと書きながらやっていたから。

## どう直したか？
- インラインに戻した


## 別のアイデア
- 小さな関数にして毎回呼び出すのもありだと思う
    - 書くのが面倒だったので採用しなかった
    - 良い関数名も思いつかなかったのもある


```go=
// 小さな関数にして毎回呼び出すのもありだと思う

func cond1() bool { 
    // いい感じの名前や説明をつけたりする
}

func cond2() bool { 
    // いい感じの名前や説明をつけたりする
}


for cond1() && cond2() {
    // ...
}
```


以上。