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)
- コード中のマジックナンバーを特定
- その数値の意味を明確にする(名前を決める)
- 定数を導入し、マジックナンバーを置き換える
- テストを実行して正しく動作することを確認
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.05や0.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_RATEやTAX_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 は「意味不明な数値を定数に置き換える」リファクタリング
- 判断基準:この数値は特別な意味を持っているか?
- 基本思想:数値に名前を与えて意図を明確にし、集中管理で変更に強くする