【まじっくなんばー】

マジックナンバー とは?

最終更新:
💡 コードに突然現れる「意味不明な数字」、定数として名前を付けよう

ソースコードに意味の説明なく直接書かれた数値のこと。何を表すか読み取りにくく、変更漏れの原因にもなるため、意味のある名前の定数に置き換えるのが一般的。

📌 このページのポイント
マジックナンバー ― 良い例と悪い例 悪い例(マジックナンバー) if (age >= 18) { price = 1500; } // 18って何?1500って何? // 意味が分からない... 良い例(定数を使用) const ADULT_AGE = 18; const TICKET_PRICE = 1500; if (age >= ADULT_AGE) { price = TICKET_PRICE; } → マジックナンバーの問題点 意味が不明 何を表す数値か分からない 変更が困難 同じ値を複数箇所で直す必要 バグの温床 修正漏れがバグの原因に
マジックナンバーのイメージ
ひよこ ひよこ
マジックナンバーってどんな問題があるの?
ペンギン先生 ペンギン先生
「if (type == 2)」というコードを見て、「2」が何を意味するかすぐにわかる?書いた本人でも時間がたつと思い出せないことがあるよね。「if (type == USER_TYPE_ADMIN)」なら意図が明確になるよ。
ひよこ ひよこ
どう直せばいいの?
ペンギン先生 ペンギン先生
意味のある名前の定数を定義して置き換えるんだ。JavaScriptなら「const MAX_RETRY_COUNT = 3」のようにね。リファクタリングの定番手法としても知られていて、読みやすくなるうえ、値を変えるときも1か所直すだけで済むよ。
ひよこ ひよこ
ファイルのマジックナンバーは別?
ペンギン先生 ペンギン先生
別の意味だよ。PNGファイルは先頭8バイトが必ず決まった値(16進数で89 50 4E 47…)になっていて、fileコマンドなどはこうした決まった位置の値を見てファイル形式を推測するんだ。このバイト列もマジックナンバーと呼ぶよ。こちらは仕様で決められた、あえて置く値だよ。
ひよこ ひよこ
マジックナンバーを見つけるにはどうすればいいの?
ペンギン先生 ペンギン先生
コードレビューで「この数字は何?」と聞かれたら候補だね。ESLintには「no-magic-numbers」というルールがあって、有効にすると名前のない数値を警告してくれるよ。標準では0や1も対象になるから、ignoreオプションで除外する値を指定できるんだ。
ひよこ ひよこ
数字を全部定数にすればいいの?
ペンギン先生 ペンギン先生
そうとは限らないよ。「i + 1」の1や配列の先頭を表す0まで定数にすると、かえって読みにくくなることがある。大事なのは「この値の意味や根拠が読み手に伝わるか」なんだ。同じ値が複数の場所に出てくるときや、将来変わりうる業務上の値は、名前を付けて1か所にまとめる価値が高いよ。
もっと詳しく知りたい人へ

定数にしたのに「NUMBER_THREE = 3」だと意味がないのはなぜ?

名前が値そのものを言い換えているだけで、「何のための3なのか」が伝わらないからだよ。たとえば再試行回数なら MAX_RETRY_COUNT、成人年齢なら ADULT_AGE のように、値の役割を名前にしよう。そうすれば、あとで値を4に変えても名前と中身が食い違わないんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
マジックナンバーって出てきたら「コードに意味の説明なく直接書かれた数値。名前の付いた定数にすると読みやすい」と思えばOK!
📖 おまけ:英語の意味
「Magic Number」 = 魔法の数字
💬 「魔法のように突然現れる(意味のわからない)数字」というイメージだよ。ファイル形式の識別に使う「マジックナンバー(マジックバイト)」は同じ呼び名の別概念なんだ

参考資料

← 用語集にもどる