マジックナンバー
Magic Number
概要(サマリー)
マジックナンバーとは、コードの中に説明なしで直接書かれた、意味や理由が読み取りにくい数値のことである。「なぜこの数字なのか」がコードだけでは読み取れないため、後から見た人(未来の自分も含む)を混乱させる。名前のついた定数として切り出し、意味を明示するのが推奨される書き方だ。AIに生成してもらったコードにも紛れ込みやすいため、意識して確認する習慣が大切だ。
詳細解説
マジックナンバーの具体例
以下のコードを見てほしい。
if (score >= 80) {
console.log('合格です');
}
setTimeout(callback, 86400000);
80 と 86400000 がマジックナンバーだ。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つの定数にまとめていれば、1箇所の修正で全体に反映できる。
AIコーディングとマジックナンバー
AIが生成するコードはしばしばマジックナンバーを含む。生成直後に「このコードの数値を、用途が分かる定数名にして、同じ意味の値だけをまとめてください」とAIに依頼すると、可読性を大きく改善できる。
よくある勘違い
マジックナンバーは数字だけの問題?
マジックナンバー自体は数値を指すことが多い。ただし、文字列でも意味が分かりにくい値が直書きされている場合は同様の問題が生じる。status === 'A' の 'A' が何を意味するのか分からないケースは、マジック文字列と呼ばれることがある。
ハードコーディングと同じもの?
似ているが、やや異なる。ハードコーディングは「変更すべき値が固定値として書かれている」という問題全般を指す。マジックナンバーはその中でも「数値の意味が不明瞭」という点に焦点を当てた用語だ。どちらも保守性を下げるという点では共通している。
定数にすれば完璧?
定数名が意味を正確に表していなければ意味がない。const A = 80 のような定数では何の解決にもならない。定数名は「その値が何を意味するか」を明示できる名前にすることが大切だ。
AIコーディングとの関係
AIにコード生成や修正を依頼するとき、マジックナンバーの意味を理解していると、出力されたコードやエラー内容を判断しやすくなる。
コードの中に説明なしで直接書かれた、意味や理由が読み取りにくい数値のこと。
AIへ相談するときは、「何をしたいのか」「どの環境で起きているのか」「どのファイルやエラーを見ているのか」を一緒に伝えるとよい。
用語だけを投げるより、具体的な状況と期待する結果を添えることで、より実用的な回答を得やすくなる。
まとめ
- マジックナンバーは、コードの中に説明なしで直接書かれた、意味や理由が読み取りにくい数値のこと。
- 関連する用語や実際の作業場面と一緒に理解すると、使いどころを判断しやすい。
- AIコーディングでは、用語の意味を理解しているほど、AIの説明や生成コードを確認しやすくなる。
- 迷ったときは、エラー内容、目的、前提条件を整理してAIに聞くとよい。
より詳しくAIに聞いてみよう
- マジックナンバーとは何か、具体例を使って初心者向けに説明してください。
- マジックナンバーをなくすための定数化のベストプラクティスを教えてください。
- マジックナンバーとハードコーディングの違いを整理してください。
- AIが生成したコードにマジックナンバーが含まれていた場合の対処法を教えてください。
- コードの可読性を上げるための命名規則のコツを教えてください。