マジックナンバー — 意味不明なリテラルが散らばる

コードに直書きされた 86400 や 0.08 が、なぜ読み手を止め変更漏れを生むのかが分かる。名前付き定数に置き換え、意図をコードに書き込む習慣が身につく。

基礎マジックナンバー定数可読性リファクタリングアンチパターン最終更新: 2026-07-28
3つの要点
TL;DR
  1. マジックナンバーは、意味の説明なくコードに直書きされたリテラル(数値や文字列)。86400 が「1日の秒数」だと、書いた本人以外には分からない。
  2. 害は2つ。読み手が値の意図を推測せねばならず理解が止まること、同じ値が複数箇所に散ると変更時に漏れること。
  3. 直し方は名前付き定数への抽出。SECONDS_PER_DAY のように名前で意図を語らせ、1箇所で定義して使い回す。値そのものではなく意味を書く。

コードの中に、説明もなく 8640070.08 が直接書かれている。書いた本人には自明でも、読む人には「この数字は何?」という謎かけになります。これがマジックナンバーです。

横にスクロール

散在する数値を意味・単位・検証付きの設定へ改善する比較
業務上変わる値に名前・単位・根拠を与え、変更箇所を一つにする。

症状:どう気づくか

  • 条件式や計算の中に、由来の分からない数値がそのまま書かれている。
  • 同じ値が複数の場所に登場する(* 1.08 があちこちに)。
  • レビューで「この数字なに?」という質問が繰り返し出る。
if user.age >= 18 and cart_total * 1.08 > 10000:
    apply_discount(cart_total * 0.05)

18(成人年齢?)、1.08(税率?)、10000(送料無料の閾値?)、0.05(割引率?)——どれも意図が説明されていません。

なぜ悪いのか

第一に、読み手を止める。数値の意味を、周辺のコードや仕様書から推測せねばならない。1.08 が消費税なのか、何かの係数なのかは、その数字だけからは決して分かりません。コードは書く回数より読まれる回数のほうがずっと多いので、この摩擦は積み重なります。

第二に、変更漏れを生む。税率が変わったとき、1.08 がコード中の何箇所にあるか、そのすべてが本当に税率なのか(1.08 はたまたま別の意味かもしれない)を、一つずつ確認して直す羽目になります。1箇所でも漏れれば、そこだけ古い税率で計算し続けるバグになります。

直し方

名前付き定数に抽出する。 値ではなく、意味に名前を付けます。

ADULT_AGE = 18
TAX_RATE = 1.08
FREE_SHIPPING_THRESHOLD = 10000
MEMBER_DISCOUNT = 0.05

if user.age >= ADULT_AGE and cart_total * TAX_RATE > FREE_SHIPPING_THRESHOLD:
    apply_discount(cart_total * MEMBER_DISCOUNT)

こうすると、コードが意図を語り始めます。TAX_RATE は1箇所で定義され、税率改定はそこを直すだけ。名前が付いたことで「これは税率だ」という前提もはっきりします。

0 と 1、そして自明な値は例外

すべてのリテラルを定数化する必要はありません。for i in range(0, n)0 や、配列の先頭 arr[0] のようなその場で意味が自明な値まで名前を付けると、かえって冗長になります。基準は「その数字が何を表すか、周辺から読み取れないか」。読み取れないなら名前を付ける。

文字列にも同じ罠(マジックストリング)

数値だけでなく、if status == "PROCESSING" のような直書き文字列も同じ問題を持ちます。タイプミスに気づけず、値の一覧も分からない。列挙型(enum)や定数にまとめると、取りうる値が明示され、誤字はコンパイル時や補完で弾けます。

まとめ

  • マジックナンバーは、意味の説明なく直書きされたリテラル。由来不明の数値・文字列が散らばる状態。
  • 害は読み手を止めることと、変更漏れを生むこと(同じ値が複数箇所に散る)。
  • 直し方は名前付き定数への抽出。値でなく意味に名前を付け、1箇所で定義して使い回す。
  • ただし 0/1 や自明な値まで定数化しない。文字列(マジックストリング)は enum でまとめると誤字も防げる。

アンチパターン図鑑の記事ガイド

マジックナンバー — 意味不明なリテラルが散らばるを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

マジックナンバー

比較で見る軸

難易度: basic / カテゴリ: アンチパターン図鑑 / タグ数: 5

導入後に効く点

害は2つ。読み手が値の意図を推測せねばならず理解が止まること、同じ値が複数箇所に散ると変更時に漏れること。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
basic
カテゴリ
アンチパターン図鑑
タグ数
5

判断チェックリスト

  • 自社の用途が「マジックナンバー / 定数」に近いか確認する。
  • 強みである「マジックナンバーは、意味の説明なくコードに直書きされたリテラル(数値や文字列)。86400 が「1日の秒数」だと、書いた本人以外には分からない。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

マジックナンバー定数可読性リファクタリングアンチパターン