Boolean変数した命名規則

7 min read
hiroweb developer

背景

Boolean 型の変数に適した命名規則をあらためて考えてみた。

適切な命名規則に従うことで、コードの可読性が向上しメンテナンス性も良くなる。

プレフィックス

Boolean 型の変数には、 ishasshould などのプレフィックスが一般的に利用される(このほかにもcanwilldidmustなども利用される)。

// 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;

否定形を避ける

Boolean型の変数で否定形を使用すると、読み手に混乱を与える可能性がある。例えば、isNotExpiredisValidでは、前者が混乱を招く可能性が高い。

// 🆖避ける例
const isNotExpired = false;

// 🆗推奨する例
const isExpired = true;

Boolean 型の変数を使う場合、否定系の単語を使うと、変数の意味が逆になってしまって、読みやすさが損なわれてしまう。たとえば、isNotExpiredは否定系の単語を使っているため、意味が逆転してしまい、読み手が混乱してしまうことがある。また、否定形を使うと条件式が複雑になって、読み手が理解するのに時間がかかることもある。そのため、できるだけ肯定系の単語を使うことを推奨する。たとえば、isExpiredではなく、isValidという単語を使うことができる。

同じ意味の単語を避ける

同じ意味を持つ単語を利用すると、読み手に混乱を与える可能性がある。例えば、isAvailableisEnabledは、機能が利用可能であるかどうかを示すが、単語が異なるために混乱を招く。

// 同じ意味を持つ単語を避ける例
const isAvailable = true;
const isEnabled = true;
const isAllowed = true;

// 避ける必要がない例
const hasPermission = true;
const canAccess = true;

同じ意味の単語を避ける理由は、開発者が同じ意味を持つ単語を違う方法で使うと、読み手が混乱してしまう場合もある。たとえば、isAvailableisEnabledisAllowedは同じような意味を持っているが、使う単語が違うので、開発者がそれらを使い分ける必要があると読み手が理解するのに時間がかかる。したがって、似たような意味を持つ単語を避け、プロジェクトで共通の命名規則を使うことが重要である。これによって、コードが読みやすくなり、メンテナンスやデバッグがしやすくなる。

プロジェクトの命名規則やコーディング規約に従う

各プロジェクトには独自の命名規則やコーディング規約が存在する場合がある。それに従うことで、ほかの開発者もコードを理解しやすくなる。

// プロジェクトの命名規則に従った例
const isExpiredDate = true;
const hasEditPermission = true;

秩序を保つためにもプロジェクト全体で決めた書き方を守ること(一貫性・統一性)がまずは大切である。

プロジェクトで決めた命名規則やコーディング規約にしたがってコードを書くことで、ほかの開発者がコードを理解しやすくなり、コードの修正や保守もスムーズに行える。各プロジェクトによって規約は異なるため、プロジェクトの方針に合わせた規約へ従うことが大切である。

Linter で矯正する(ESLint)

もし、Webフロントエンド環境で 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'],
      },
    ],
  },
};