← 用語集一覧へ戻る

マジックナンバー

Magic Number
コードの中に説明なしで直接書かれた意味不明な数値のこと。なぜその数値なのかがコードから読み取れず、保守・変更を難しくする原因になる。定数に名前をつけて管理するのが望ましい。
マジックナンバー (Magic Number)

概要(サマリー)

マジックナンバーとは、コードの中に説明なしで直接書かれた意味不明な数値のことである。「なぜこの数字なのか」がコードだけでは読み取れないため、後から見た人(未来の自分も含む)を混乱させる。名前のついた定数として切り出し、意味を明示するのが推奨される書き方だ。AIに生成してもらったコードにも紛れ込みやすいため、意識して確認する習慣が大切だ。

詳細解説

マジックナンバーの具体例

以下のコードを見てほしい。

if (score >= 80) {
  console.log('合格です');
}

setTimeout(callback, 86400000);

8086400000 がマジックナンバーだ。80 が何の基準なのか、86400000 が何ミリ秒を表すのか、コードを読んだだけではわからない。

定数に名前をつけて解決する

マジックナンバーを解消するには、意味のある名前をつけた定数として定義する。

const PASS_SCORE = 80;
const ONE_DAY_MS = 86400000;

if (score >= PASS_SCORE) {
  console.log('合格です');
}

setTimeout(callback, ONE_DAY_MS);

PASS_SCORE(合格点)ONE_DAY_MS(1日のミリ秒数)という名前がつくことで、コードの意図が一目でわかるようになる。

なぜマジックナンバーが問題なのか

マジックナンバーの問題は主に2点ある。

1. 意味が不明確になる
86400000 が1日を意味すると分かる人は多くない。コードレビューやデバッグのたびに計算し直す必要が生じる。

2. 修正漏れが起きやすい
同じ数値が複数箇所に散らばっている場合、1箇所だけ変更してほかを変え忘れるというバグが発生しやすい。定数なら1箇所の修正で全体に反映できる。

AIコーディングとマジックナンバー

AIが生成するコードはしばしばマジックナンバーを含む。生成直後に「このコードの数値に定数名をつけてほしい」とAIに依頼するだけで、可読性を大きく改善できる。

よくある勘違い

マジックナンバーは数字だけの問題?

厳密にはそうではない。文字列でも意味不明な値が直書きされている場合は同様の問題が生じる。status === 'A''A' が何を意味するのか分からないケースもマジック文字列と呼ばれることがある。

ハードコーディングと同じもの?

似ているが、やや異なる。ハードコーディングは「変更すべき値が固定値として書かれている」という問題全般を指す。マジックナンバーはその中でも「数値の意味が不明瞭」という点に焦点を当てた用語だ。どちらも保守性を下げるという点では共通している。

定数にすれば完璧?

定数名が意味を正確に表していなければ意味がない。const A = 80 のような定数では何の解決にもならない。定数名は「その値が何を意味するか」を明示できる名前にすることが大切だ。

より詳しくAIに聞いてみよう

  • マジックナンバーとは何か、具体例を使って初心者向けに説明してください。
  • マジックナンバーをなくすための定数化のベストプラクティスを教えてください。
  • マジックナンバーとハードコーディングの違いを整理してください。
  • AIが生成したコードにマジックナンバーが含まれていた場合の対処法を教えてください。
  • コードの可読性を上げるための命名規則のコツを教えてください。