「booleanの変数名の先頭にisを付けるべきか否か」をBingChat(ChatGPT)に聞いてみた

# ≪長くなったので要約≫
- <b>変数の先頭に付けてもよさそうな単語</b>
is（です）
has（がある）
can（ができる）
was（でした）
contains （を含む）
exist（いる）
all（すべて - 端から端まで）
every（すべて - もれなくすべて）
some（いくつか - 1個以上）
any（どれでも - 0個以上）

- <b>動詞や助動詞で始めることで真偽値を表す</b>
例えば、is + 形容詞、has + 過去分詞、三単現動詞 + 名詞、助動詞 + 動詞などです。

- <b>YesとNoが明確でない命名を避ける</b>
例えば、resultやvalidなどです。これらは何を表しているのかわかりにくいです。

- <b>主語を含めたい場合は、例外的に主語 + 三単現動詞という形式を使うことができる</b>
例えば、userExistsやfileExistsなどです。

- <b>先頭にshouldは付けるべきでは無い</b>
二値の選択肢を示すようにするべきです。もしもshouldを使いたい場合は、メソッド名にすると良いかもしれません。
例えば、shouldUpdateやshouldDeleteなどです。

- <b>isInvalidはダメ、isValidにすべき</b>
妥当でない場合にtrue、妥当な場合にfalseが入るようにしたisInvalidという変数は、意味が分かりづらくなります。
この場合は、isValidとするほうが良いでしょう。

- <b>命名に困った時は、if文の条件に入れたときに文章として成立するようにするとよい</b>
例えば、「ユーザー名を取得するかどうか」を表す変数は、getUserやwantUserではなく、hasUserやneedsUserとするほうが自然です。

- <b>「アップデートをしなければならない」を示す変数名の候補を教えて</b>
「needsUpdate」や「requiresUpdate」などが考えられます。これらは三単現動詞+名詞の形で、booleanメソッドの命名規則にも合致します。

- <b>「アップデートが可能」を示す変数名の候補を教えて</b>
「canUpdate」や「isUpdatable」などが考えられます。これらは助動詞+動詞やis+形容詞の形で、booleanメソッドの命名規則にも合致します。

- <b>「アップデートが不可能」を示す変数名の候補を教えて</b>
「cannotUpdate」や「isNotUpdatable」などが考えられます。これらは否定形の助動詞+動詞やis+not+形容詞の形で、booleanメソッドの命名規則にも合致します。

### booleanの変数名の先頭にisを付けるべきか否か
こんにちは、これはBingです。😊

booleanの変数名の先頭にisを付けるべきか否かは、プログラミング言語やコーディング規約によって異なりますが、一般的には<b>isを付けることで真偽値を表すことができます。</b>ただし、<b>動詞から始まる変数名はメソッド名に見える</b>可能性もあるので注意が必要です。また、booleanメソッドの命名規則では、主語を持つ場合はisを付けないこともあります。

### 動詞から始まる変数名でメソッド名に見える可能性
一般的には、<b>変数名は名詞で、メソッド名は動詞で宣言すると読みやすい</b>コードになります。
例えば、英語の点数を取得するか否かというboolean変数は、wantEnglishResultではなく、englishResultNeededやhasEnglishResultなどのようにすると良いでしょう。

### booleanの変数の命名規則教えて
一般的には以下のようなルールがあります。
- 動詞や助動詞で始めることで真偽値を表すことができます。
例えば、is + 形容詞、has + 過去分詞、三単現動詞 + 名詞、助動詞 + 動詞などです。
- YesとNoが明確でない命名を避けるべきです。
例えば、resultやvalidなどです。これらは何を表しているのかわかりにくいです。
- 主語を含めたい場合は、例外的に主語 + 三単現動詞という形式を使うことができます。
例えば、userExistsやfileExistsなどです。


### booleanの変数名の先頭にisを付けない方がいい例
booleanの変数名の先頭にisを付けない方がいい例としては、以下のようなものがあります。

<b>isで始められない英語的に難しい場合。</b>
例えば、「全アイテムが削除済みかどうか」を表す変数は、isAllItemsRemovedではなく、everyItemRemovedやallItemsRemovedとすることができます。

<b>意味が逆になってしまう場合。</b>
~~例えば、妥当でない場合にtrue、妥当な場合にfalseが入るようにしたisValidという変数は、意味が分かりづらくなります。
この場合は、isInvalidやnotValidとするほうが良いでしょう。~~

:::note alert
validとisinvalidが逆になってると思う
:::


<b>if文の条件に入れたときに文章として成立しない場合。</b>
例えば、「ユーザー名を取得するかどうか」を表す変数は、getUserやwantUserではなく、hasUserやneedsUserとするほうが自然です。

### booleanの変数名の先頭にisを付けた例で最も恥ずかしい例を示して
一般的には、booleanの変数名やメソッド名にはisやhasなどの助動詞を使うことが推奨されています。
しかし、この規則を無視したり、否定的な意味を持つ変数名を使ったりすると、コードの可読性や保守性が低下する可能性があります。

例えば、以下のような変数名は恥ずかしいと言えるでしょう。

<b>isNotLast</b>: 最後ではないという否定的な意味を持つ変数名は混乱を招く可能性があります。代わりにisFirstやhasNextなどの肯定的な意味を持つ変数名を使うべきです。

<b>isLame</b>: 変数名に感情的な表現や差別的な言葉を使うのは非常に不適切です。代わりにisPoorQualityやisUnsatisfactoryなどの客観的で明確な表現を使うべきです。

<b>isYes</b>: boolean型の変数名にYesやNoという単語を使うのは冗長で不自然です。代わりにisEnabledやisSelectedなどの動詞形式を使うべきです。

以上が私が見つけた恥ずかしいboolean型変数名の例です。他にもありますか？

##### 2023-02-23追記
### booleanの変数名で先頭に付ける単語を教えて
booleanの変数名で先頭に付ける単語は、一般的には<b>「is」や「has」がよく使われます。</b>
例えば、空かどうかを表す変数なら「isEmpty」、有効かどうかを表す変数なら「isValid」というように、<b>英文として意味が通じるように命名します。</b>

ただし、isやhasで始められない場合や英語的に難しい場合は、別の単語を使っても構いません。
例えば、「全アイテムが削除済みかどうか」を表す変数は、「isAllItemsRemoved」ではなく、
「everyItemRemoved」や「allItemsRemoved」とすることができます。

boolean型のメソッド名も同様のルールで命名することが多いです。
例えば、「ユーザーが存在するかどうか」を返すメソッドなら、「existsUser」というように<b>動詞から始めることができます。</b>

### is、has以外の選択肢はある？
はい、isやhas以外の選択肢もあります。
例えば、<b>三単現動詞 + 名詞や助動詞 + 動詞というパターンも使えます。</b>
例えば、「ユーザーが存在するかどうか」を表す変数なら<b>「existsUser」や「doesUserExist」</b>というように命名することができます。

また、英語的に難しい場合は、isやhasを省略しても構いません。
例えば、「全アイテムが削除済みかどうか」を表す変数は、「everyItemRemoved」や「allItemsRemoved」というように命名することができます。

ただし、boolean型の変数名やメソッド名は、<b>YesとNoが明確でない命名は避けるべきです。</b>
例えば、「ユーザーの状態」を表す変数なら、<b>「userStatus」というよりは、「userActive」や「userLoggedIn」</b>というように具体的にすることが望ましいです。

### booleanの変数名に使える、三単現動詞や助動詞を知りたい
booleanの変数名に使える三単現動詞や助動詞はたくさんありますが、一般的には<b>is, has, can, was, contains</b>などがよく使われます。
例えば、isDeleted, hasAccess, canWriteなどです。

booleanの変数名に否定形を使うのは避けるべきです。
例えば、notFoundではなくfoundというようにします。

### もっと知りたい

booleanの変数名についてもっと知りたいのですね。では、以下のようなベストプラクティスを紹介します。
- booleanの変数名は、すべてのケースが真であることを確認する場合はeveryやallを、一つでも真であることを確認する場合はsomeやanyを使うと良いです。
 例えば、users.every(user => user.isActive)ならisActiveUsersやallUsersActiveなどです。
- booleanの変数名は、カスタムの接頭辞を避けると良いです。例えば、shouldDoSomethingではなくdoSomethingというようにします。
- booleanの変数名は、肯定的な名前を使うと良いです。例えば、isNotValidではなくisValidというようにします。

### booleanの変数名で先頭にshoudが付くのは変ですか？
booleanの変数名で先頭にshouldが付くのは変ではないと思いますが、<b>一般的ではありません。</b>
booleanの変数名は、二値の選択肢を示すようにするべきです。
例えば、isReadyやhasChildrenなどです。

また、否定的なbooleanの変数名は避けるべきです。
例えば、isNotLastではなくisFirstやisLastを使う方が良いでしょう。

<b>もしもshouldを使いたい場合は、メソッド名にすると良いかもしれません。</b>
例えば、shouldUpdateやshouldDeleteなどです。



<hr>

ちょっとboolean変数の命名に迷ったんで気軽に調べてみたんだが、素晴らしい内容じゃないか！
googってこの見解に至るまでっていったら丸一日はかかるんじゃなかろうか。
末恐ろしいな😱、正直驚いた。ITエンジニアにも危機が訪れそうな予感。。。