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のオブジェクトでは、単に enabledactive と書くことも多いよね。

でも、関数(メソッド)として定義するなら、**「質問を投げかけている」**ことが明確になる is, has, can, should などの助動詞から始めるのが、リーダブルコードへの近道だよ!