クリーンなコードの解説に出てくるクリーンな方の例が汚いと説得力がないよね

キミのコードが汚い理由 - ITmedia エンタープライズ

リスト2の方が複雑な条件になっているが、Javaを理解していれば、かなり読みやすい。唯一疑問を抱くかもしれないとしたら、最後の「else if」の中にある条件の最初の部分だけだ。このクローズに来るということは、どちらかのプレーヤーが勝ったことを意味する。

 いずれのインプリメンテーションも間違ってはいない。

リスト1とリスト2が例に挙がっていて、リスト2のほうがいいよ、っていうような感じの記事なんだが、
リスト2のほうはバグがある。引き分けのはずなのに"Player2 leads"という文字列が返ってしまうのだ。


バグを筆者が見逃したのは、リスト2が読みにくくて汚いコードだからではないか。

ちなみに僕が書くとこんな感じにするだろうな。

public String getSetScore() {
  int leader = gamesWon[0] > gamesWon[1] ? 1 : 2;
  int g0 = gamesWon[leader - 1]; // 勝っているほうのスコア
  int g1 = gamesWon[2 - leader]; // 負けているほうのスコア

  if (g0 == g1) {
    return "Set is tied at " + g0;
  } else if (g0 >= 7 || (g0 == 6 && g1 <= 4)) {
    return "Player" + leader + " wins the set " + g0 + " - " + g1;
  } else {
    return "Player" + leader + " leads " + g0 + " - " + g1;
  }
}

ちなみにリンク先のリスト1では6-6のときだけ別のメッセージが出るがそれにはこのリストは対応していない。


あと、個人的な意見だけど、綺麗なコードをかけるようになるためには、
リンク先のように綺麗なコードとは何かを勉強するとかいう以前に、
ひとつの仕様に対して複数のインプリメントが速攻で頭に浮かんでくるようにならないといけない。
一種類しかコードが頭に浮かんでこないようだったら、綺麗も汚いもなく、それを書くしかなくなるから。


ただ、本当に綺麗なコードばっかり書いている人は、
綺麗なコードしか頭に浮かんでこないだろうと思うけど。


マイコンベーシックマガジンという雑誌に、森田和郎氏が将棋のアルゴリズムについての解説を連載していたんだけど、
「将棋が強い人の場合、明らかに悪い手は最初っから頭に浮かんでこないのだ」
みたいなことが書かれていたような気がする。