🔦
ネイティブに学ぶbool型の命名のTips
はじめに
プログラミングにおいて難しい課題の一つに「命名」があります。適切な名前をつけることで、後々のバグを防ぎ、可読性の高いクリーンなコードを保つ助けとなります。
特にbool型の変数はその名前がコードの意図を明確にするため重要です。正しい命名は、コードを読みやすくしチーム全体での理解を深めることができます。
今回はネイティブ英語話者の記事を参考にしながら、bool 型の命名に関するTipsを詳しく見ていきたいと思います。
bool型の命名のヒント
bool型の命名には、isLoggedIn
やhasAccess
のように、is
やhas
をつける慣習があります。しかしこの慣習に従わないコードを見たり書いたりすることもあった。
全てのルールにおいて、例外は存在し慣習に従うよりも良い場合も存在する。
全てのケースでtrueを確認する場合のbool値
final xxx = users.every((user) => user.isActive);
XXXは全てのuserがactiveの場合にのみtrueになる。どのように命名をするべきでしょうか?
変数 | 良い | 理由 |
---|---|---|
isUsersLoggedIn | 🤨 | 文法的に正しくない |
areUsersLoggedIn | 🤔 | 慣習的ではない接頭辞(is,hasなどが慣習的で複数形のareなどはそうでない) |
isEveryUserLoggedIn | 👍 | iterable.everyに合ってる |
isEachUserLoggedIn | 🥰 | 場合によるがevery よりも自然 |
多くのうちいずれかがtrueの場合のbool値
final xxx = users.any((user) => user.isActive);
XXXは少なくとも1人のuserがactiveならtrueになる
変数 | 良い | 理由 |
---|---|---|
isUsersActive | 🙁 | 文法的に正しくないかつ曖昧な表現 |
isAtLeastOneUserActive | 😵 | 言葉が多すぎる |
isOneUserActive | 🤥 | 正しい状態を表していない。Activeなユーザーが1人しかいないことを意味する |
isSomeUserActive | 👍 | any メソッドの意図を反映し、コードの動作と一致している。簡潔で意図が伝わりやすい |
isAnyUserActive | 🤗 | any メソッドの名前に直接対応しており、最も自然でわかりやすい表現 |
慣習的ではないprefixを避ける
変数名に「慣習的ではない接頭辞(カスタムプレフィックス)」を使うことは避けるべきだという提案
変数 | 良い | 理由 |
---|---|---|
wasPaidFor | 🤔 | was は過去形を表すが、接頭辞として一般的ではなく、現在の状態も含むべきかどうかが曖昧で混乱を招くことがある。 |
areBillsPaidFor | 🤔 | are を接頭辞にしており、文法的には正しいが、カスタムプレフィックス(are)を使うことで冗長かつ非慣習的になる。 |
hadHaveHadBeenPaidFor | 😶 | 過剰に複雑で冗長な命名は理解に時間がかかるので良くない。 |
isPaidFor | 😊 | 現在の状態を正確かつ簡潔に示す、標準的で直感的な命名規則に基づいている |
肯定的な名前
変数 | 良い | 理由 |
---|---|---|
isDisabled | 🧐 | 否定的な名前であり、!isDisabled のように否定を使うと読み手が混乱する可能性がある。 |
isNotActive | 🤯 | 「二重否定」(!isNotActive)は非常に分かりにくく、論理を追うのが難しい。 |
hasNoBillingAddress | 😞 | Noのためのno は使用しない |
isEnabled / isActive / hasBillingAddress | 😁 | 肯定的な名前を使用することで、!isActive のように簡単かつ自然に否定を表現できる。 |
if (!account.isDisabled) {
// ...
}
// 否定系よりも肯定系のほうが読みやすい
if (account.isEnabled) {
// ...
}
もう少し複雑な例を見てみよう
// anyや!の組み合わせによりコードを読むのに若干負荷がかかる
final isAnyUserOffline = users.any((user) => !user.isOnline);
if (isAnyUserOffline) {
// ...
}
// 上の例は機能として問題はないが、挙動が同じでより理解しやすい書き方で書くことが可能
final isEveryUserOnline = users.every((user) => user.isOnline);
if (!isEveryUserOnline) {
// ...
}
さいごに
ネイティブの記事をもとにbool型の命名の例についていくつかみてきました
文法的に正しくかつ認知負荷が低い命名の例が紹介されておりとても参考になると思います。皆さんの参考になれば幸いです。
Discussion