if文でfalseと比較する


if文で truefalse と比較しないよう勧めている記事が多いですね。
true と比較しないということには賛成ですが、false と比較しないということには反対です。

truefalse と比較すべきではない理由としては主に以下の2つだと思います。

  • 冗長
  • 代入と間違える

理解はできます。

if ( enabled == true ) { ... }
if ( enabled == false ) { ... }

よりも

if ( enabled ) { ... }
if ( !enabled ) { ... }

の方がシンプルですし、== で比較すると

if ( enabled = true ) { ... }
if ( enabled = false ) { ... }

のように間違って代入してしまう危険もあります。
(代入に関しては、言語によっては認められていませんし、最近のコンパイラは警告を出してくれることも多いと思いますが。)
代入になってしまうのを防ぐためにヨーダ記法を採用するという手もありますが、ヨーダ記法は直感的じゃなくて読みにくいので個人的には嫌いです。

それを理解した上で何故反対かというと、読み間違えるからです。

ソースコードを、それこそ流し読みレベルで読んでいると、この ! という1文字を見逃します(少なくとも私は)。
たった1文字見逃すだけで意味が大きく変わってしまいます。
また、真偽値を返す関数は is で始めることが多く、"i" と "!" が似ていることも見逃す要因になっていると思います。
以下のソースを読むとき、脳も目も疲れていると、if ( isEnabled() ) と読んでしまいます。

if ( !isEnabled() ) { ... }

「なんか i がボヤけてた気がするけど、画面をスクロールした影響かな?」とか思いつつも ! を認識しません。
人間は愚かな生き物で、一度 if ( isEnabled() ) だと思い込んだら、再度読み直した時も ! を見逃すのです。

今まで何度か、この ! 見逃しが原因で、デバッグ中に「なんでこのif文に入るのか分からん!」と悩んだことがあります。

以下のように ! の後ろにスペースがあると、かなり有り難いですが、! が孤立してしまって見た目が好きになれません。

if ( ! isEnabled() ) { ... }

「ちゃんと注意深く読め」と言われれると何も反論はできないですけど、これが false と比較する理由です。

ということで、私は true との == 比較は行いませんが、false との == 比較は行います。

if ( enabled ) { ... }
if ( enabled == false ) { ... }

IDEやテキストエディターが ! の文字色を変えてくれるようになったら考えが変わるかもしれませんけど。