7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

if文でfalseと比較する

Posted at

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

7
4
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?