0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【リファクタリング】Replace Magic Number with Symbolic Constant(マジックナンバーを定数に置き換える)

Posted at

1. 概要(Overview)

Replace Magic Number with Symbolic Constant は、コード中に直接書かれている 意味の分からない数値(マジックナンバー) を、意味を表す定数 に置き換えるリファクタリングです。

マジックナンバーは一見するとただの数値に見えるため、

  • その数値の意味がわからない
  • 値の変更が必要なときに修正箇所を探しにくい
  • 間違った数値を使っても気づきにくい

といった問題が起こります。

目的は以下の通りです:

  • コードの意図を明確にする
  • 定数の集中管理で変更に強くする
  • バグを減らし、自己文書化的なコードにする

2. 適用シーン(When to Use)

  • 「100」「3.14」「0.05」などの数値が、コードの中に直接書かれている
  • 同じ数値が複数箇所に出てきていて、意味が不明確/変更に弱い
  • その値に明確な意味(利率、閾値、係数、識別コード)がある

例:

  • 金利の「0.05」
  • 税率の「0.1」
  • 円周率の「3.14159」
  • ステータスコードの「404」

3. 手順(Mechanics / Steps)

  1. コード中のマジックナンバーを特定
  2. その数値の意味を明確にする(名前を決める)
  3. 定数を導入し、マジックナンバーを置き換える
  4. テストを実行して正しく動作することを確認

4. Kotlin 例(Before → After)

Before:マジックナンバーが散らばっている

fun calculateDiscount(price: Double): Double {
    return price * 0.05  // 0.05 が何を意味するのか不明
}

fun calculateTax(price: Double): Double {
    return price * 0.1   // 0.1 も意味が不明
}
  • 0.050.1 の意味が読み手に伝わらない
  • 変更時に全ての場所を探して修正する必要がある

After:意味のある定数に置き換え

const val DISCOUNT_RATE = 0.05
const val TAX_RATE = 0.1

fun calculateDiscount(price: Double): Double {
    return price * DISCOUNT_RATE
}

fun calculateTax(price: Double): Double {
    return price * TAX_RATE
}
  • DISCOUNT_RATETAX_RATE に置き換えることで意図が明確に
  • 値を変更したいときは定数を修正するだけで済む

After②:オブジェクトや Enum にまとめる

object Rates {
    const val DISCOUNT = 0.05
    const val TAX = 0.1
}

fun calculateDiscount(price: Double): Double {
    return price * Rates.DISCOUNT
}

fun calculateTax(price: Double): Double {
    return price * Rates.TAX
}

→ 関連する定数をまとめることで整理され、再利用性も高まる。


5. 効果(Benefits)

  • 意図が明確になり、可読性・保守性が向上
  • 定数を変更するだけで影響範囲をコントロール可能
  • 誤用や数値入力ミスの防止につながる
  • 自己文書化コードに近づく

6. 注意点(Pitfalls)

  • 一度しか出てこない単純な数値(例:配列サイズ 2 やループ回数 3)にまで適用すると冗長になる
  • 名前の付け方が適切でないと、逆に混乱を招く
  • 係数や閾値などは ドメインに即した名前 を付けるのが望ましい

まとめ

  • Replace Magic Number with Symbolic Constant は「意味不明な数値を定数に置き換える」リファクタリング
  • 判断基準:この数値は特別な意味を持っているか?
  • 基本思想:数値に名前を与えて意図を明確にし、集中管理で変更に強くする

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?