【まじっくなんばー】

マジックナンバー とは?

💡 コードに突然現れる「意味不明な数字」、定数として名前を付けよう
📌 このページのポイント
マジックナンバー ― 良い例と悪い例 悪い例(マジックナンバー) 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」が何を意味するかすぐにわかる?翌月に自分で見ても「なんで2なの?」となる。「if (type == USER_TYPE_ADMIN)」なら意図が明確だよね。

ひよこ ひよこ

どう直せばいいの?

ペンギン先生 ペンギン先生

定数定数名)を定義して置き換える。JavaScriptなら「const HTTP_OK = 200」「const MAX_RETRY_COUNT = 3」のように。意味のある名前を付けることで読みやすくなり、値を変えるときも1箇所直すだけでよくなる。

ひよこ ひよこ

ファイルのマジックナンバーは別?

ペンギン先生 ペンギン先生

そう、別の概念。PDFファイルの先頭バイトが「%PDF」、ZIPは「PK」、PNGは特定のバイト列というようにファイル形式を識別するための特定バイト列を「マジックバイト(マジックナンバー)」と呼ぶ。こちらは意図的な仕様。

ひよこ ひよこ

マジックナンバーを見つけるにはどうすればいいの?

ペンギン先生 ペンギン先生

コードレビューで「この数字は何?」と聞かれたら、それがマジックナンバーだよ。ESLintなどの静的解析ツールには「no-magic-numbers」ルールがあって、自動で検出してくれる。ただし0や1のような自明な数値まで検出すると煩わしいから、設定で除外するのが一般的だね。

ひよこ ひよこ

マジックナンバーが残ったままのコードって実際多いの?

ペンギン先生 ペンギン先生

レガシーコードでは驚くほど多いよ。if (status == 7) のような条件が何十箇所もあって、7が何を意味するか誰も把握していないなんてことも。こういうコードは「考古学」と呼ばれるくらい解読が大変。新規開発では定数を使うのが当然だけど、レガシーコードのリファクタリングでマジックナンバーを定数に置き換えるのは、最も効果の高い改善作業の一つだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
マジックナンバーって出てきたら「コードに意味の説明なく直接書かれた数値、定数化して名前を付けるのが正解」と思えばOK!
📖 おまけ:英語の意味
「Magic Number」 = 魔法の数字
💬 「魔法のように突然現れる(意味不明な)数字」という意味。ファイルフォーマット識別に使う「マジックバイト」とは別の概念
← 用語集にもどる