背景
Boolean 型の変数に適した命名規則をあらためて考えてみた。
適切な命名規則に従うことで、コードの可読性が向上しメンテナンス性も良くなる。
プレフィックス
Boolean 型の変数には、 is
、has
、should
などの意味をもつプレフィックスを使用する。
// isを使った例
const isExpired = true;
const isFinished = false;
// hasを使った例
const hasPermission = true;
const hasError = false;
// shouldを使った例
const shouldShowModal = true;
const shouldFetchData = false;
プレフィックスを付ける理由は、その変数が真偽値を表していることが明確になり、コードの可読性を向上させるためである。たとえば、isExpired
という変数名は、その変数が有効期限切れかどうかを表していることが明確になる。expired
という変数名だけでは、何が期限切れなのかが明確ではない。
また、真偽値を表す変数にプレフィックスを付けることで、コードエディタのサジェストでヒットしやすくなる。
どのような条件なのか分かりやすくする
変数名には、真偽値がどのような条件を表しているかを示す名前を付ける。
// 有効期限切れかどうかを示す
const isExpired = true;
// 許可があるかどうかを示す
const hasPermission = true;
// モーダルを表示する必要があるかどうかを示す
const shouldShowModal = true;
変数名には、その変数の真偽値が何に対する条件であるかを示す名前を付ける。たとえば、isExpired
という変数名は、有効期限が切れたかどうかを表していることが分かる。これに対して、isEnabled
という変数名だけではどのような条件に対して真偽値が返されるかを明確に表現できない。
否定形を避ける
// 🆖避ける例
const isNotExpired = false;
// 🆗推奨する例
const isExpired = true;
Boolean 型の変数を使う場合、否定系の単語を使うと、変数の意味が逆になってしまって、読みやすさが損なわれてしまう。たとえば、isNotExpired
は否定系の単語を使っているため、意味が逆転してしまい、読み手が混乱してしまうことがある。また、否定形を使うと条件式が複雑になって、読み手が理解するのに時間がかかることもある。そのため、できるだけ肯定系の単語を使うことを推奨する。たとえば、isExpired
ではなく、isValid
という単語を使うことができる。
同じ意味の単語を避ける
// 同じ意味を持つ単語を避ける例
const isAvailable = true;
const isEnabled = true;
const isAllowed = true;
// 避ける必要がない例
const hasPermission = true;
const canAccess = true;
同じ意味の単語を避ける理由は、開発者が同じ意味を持つ単語を違う方法で使うと、読み手が混乱してしまう場合もある。たとえば、isAvailable
とisEnabled
とisAllowed
は同じような意味を持っているが、使う単語が違うので、開発者がそれらを使い分ける必要があると読み手が理解するのに時間がかかる。したがって、似たような意味を持つ単語を避け、プロジェクトで共通の命名規則を使うことが重要である。これによって、コードが読みやすくなり、メンテナンスやデバッグがしやすくなる。
プロジェクトの命名規則やコーディング規約に従う
// プロジェクトの命名規則に従った例
const isExpiredDate = true;
const hasEditPermission = true;
const shouldShowPaymentModal = true;
秩序を保つためにもプロジェクト全体で決めた書き方を守ることがまずは大切である。
プロジェクトで決めた命名規則やコーディング規約にしたがってコードを書くことで、ほかの開発者がコードを理解しやすくなり、コードの修正や保守もスムーズに行える。各プロジェクトによって規約は異なるため、プロジェクトの方針に合わせた規約へ従うことが大切である。
Linter で矯正する
もしフロントエンド環境で ESLint を導入していて、@typescript-eslint
を利用している環境であれば、@typescript-eslint/naming-convention
ルールを適用することで Boolean 型変数の命名に接頭辞をチェックできる。
// .eslintrc.js
module.exports = {
// ...
rules: {
'@typescript-eslint/naming-convention': [
'error',
{
selector: 'variable',
types: ['boolean'],
prefix: ['is', 'has', 'should'],
},
],
},
};