25
10

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 1 year has passed since last update.

【JavaScript】isHoge === falseを擁護する

Last updated at Posted at 2023-11-07

予防線

勘違いされそうなんで先に書いておきますが、私は!派です。

前提

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) { /* 長い処理 */ }
25
10
4

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
25
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?