Prompt
Booleanを返す関数で、
isNotXxx()のような、falseがデフォルトであるような設計は適切か?
やっほー!その「否定形のフラグ」、エンジニアが夜も眠れなくなるほど議論される深いテーマだね!
結論から言うと、「isNotXxx() のような否定形の名付けは、基本的には避けるべき(アンチパターン)」とされることが多いよ。理由はシンプルで、「二重否定」が脳の計算リソースを無駄に消費するからなんだ。
情報工学を学ぶ君の脳をバグらせないために、なぜそれが「適切ではない」のか、そして唯一の例外は何かを整理してみたよ!
1. 最大の敵:二重否定(Double Negative)
もし isNotAvailable() という関数があったとして、「利用可能なとき」の条件式を想像してみて。
JavaScript
if (!isNotAvailable()) {
// 利用可能なときの処理
}
「利用不可(NotAvailable)」ではない(!not)とき……。
これ、一瞬フリーズしない?プログラムを書く時間よりも、後から読む時間の方が圧倒的に長いから、この「脳内での論理反転」を強いる設計は、バグの温床になりやすいんだ。
2. デフォルト値の考え方
君が言った「falseがデフォルト」というのは、「通常は許可されているけれど、特定のときだけ禁止したい」という文脈かな? その場合でも、名前は肯定形にするのが定石だよ。
-
Bad:
isNotAllowed(デフォルト false = 許可) -
Good:
isEnabled(デフォルト true = 許可) またはisDisabled
もし「デフォルトが許可(何も設定しなければOK)」なら、プロパティ名は isEnabled にして初期値を true にするか、あるいは 「例外的な状態」を肯定形で表す名前(例:isSuspended, isBlocked)を選ぶのがオシャレだね。
3. 💡 唯一の例外:その単語自体が意味を持っている場合
「否定形」ではなく、**「その状態そのものを示す単語」**ならアリだよ。
-
isEmpty():中身がないとき true。 -
isInvalid():不正なとき true。
これらは isNotEmpty() や isNotValid() という「Not」を無理やりくっつけた形ではないから、自然に読めるよね。でも、これらも if (!isEmpty()) と書くと結局脳に負荷がかかるから、使い所にはセンスが問われるんだ。
⚠️ 見落とされがちな落とし穴:ド・モルガンの法則
否定形の変数を使っていると、複数の条件を組み合わせた時に地獄を見るよ。
C#
// 否定形が混ざると、条件式の簡略化(ド・モルガンの法則)をするときに
// 符号を間違える確率が跳ね上がるんだ!
if (!isNotReady || !isNotAuthorized) { ... } // 脳が爆発する
💡 豆知識:Booleanの「is」は省略する?
Javaでは isXxx() が標準だけど、C#のプロパティやJavaScriptのオブジェクトでは、単に enabled や active と書くことも多いよね。
でも、関数(メソッド)として定義するなら、**「質問を投げかけている」**ことが明確になる is, has, can, should などの助動詞から始めるのが、リーダブルコードへの近道だよ!