予防線
勘違いされそうなんで先に書いておきますが、私は!
派です。
前提
ifの条件式の部分で真偽値ではない値を他の値と比較せずに書くことを禁止するコーディング規約があるとします。
trueと比較する愚かさ
if (isHoge === true) something();
上記のコードはisHogeがtrueかどうかを比較している。
しかし、isHogeがtrueならtrueだし、falseならfalseになるのは明らかだ。
比較する処理が冗長なのは言うまでもないだろう。
if (isHoge) something();
また上記のようなコードが書かれていたら大半のプログラマは
「isHogeがtrueのときにsomethingが実行されるのね」と0.001秒で分かるだろう。(伏線)
isHoge === falseはどうなのか?
if (isHoge === false) something();
上記のようなコードも嫌われがちだ。
彼らは言うだろう。「falseと比較するな、!
を使え。」と。
if (!isHoge) something();
確かに!
を使ったほうがコード量が減りきれいに見える。
そう、確かにそういう利点はある。だが…
現実
現実世界では大量に書かれているif文、条件がものすごく長いif文を見なければいけないことがある。
仮になんかの処理でif文が100個くらい書かれていたとしよう。
if (isHoge1) { /* 長い処理 */ }
if (isHoge2) { /* 長い処理 */ }
if (isHoge3) { /* 長い処理 */ }
// 省略…
if (isHoge50) { /* 長い処理 */ }
if (!isHoge51) { /* 長い処理 */ }
if (isHoge52) { /* 長い処理 */ }
// 省略…
if (isHoge98) { /* 長い処理 */ }
if (isHoge99) { /* 長い処理 */ }
if (isHoge100) { /* 長い処理 */ }
(はっきり言ってこんなコードは最低最悪だが、現実では動きゃいいだろ思考のコピペプログラマやFizzBuzzを1時間考えても実装できないプログラマが存在するので、たまにこういうコードを目にしてしまうことが不幸にもある。)
さて、このクソ多いif文のなかでisHoge51だけfalseであるときにifの中身が実行されるようになっている。
じっくり見れば分かるかもしれないが、我々の時間は有限であり、こんな処理はパっと見でしか見ないのだ。見落としても仕方ないだろう。
…仮にこの処理でバグがあったとする。
さらにその原因が「isHoge51がtrueであるときにif文の中身が実行されると勘違いしたから」だとする。
そんなとき、人は同じ過ちを犯さないようにこう直すのだ。
if (isHoge1) { /* 長い処理 */ }
if (isHoge2) { /* 長い処理 */ }
if (isHoge3) { /* 長い処理 */ }
// 省略…
if (isHoge50) { /* 長い処理 */ }
if (isHoge51 === false) { /* 長い処理 */ }
if (isHoge52) { /* 長い処理 */ }
// 省略…
if (isHoge98) { /* 長い処理 */ }
if (isHoge99) { /* 長い処理 */ }
if (isHoge100) { /* 長い処理 */ }