マジックナンバーとは、意味が分からないままコードに直接書かれた数値のことです。
同じように、意味が分からない文字列をマジック文字列と呼ぶことがあります。
一言でいうと
マジックナンバーやマジック文字列は、値の意味を名前で説明していない状態です。
値そのものは正しくても、読み手が「なぜこの値なのか」を理解できなければ、変更時に事故が起きます。
悪い例
function canRetry(count: number) {
return count < 3;
}
function isAdmin(role: string) {
return role === "admin";
}
3 が何を意味するのか、"admin" がどこで定義された権限名なのかが分かりにくいです。
よい例
const MAX_RETRY_COUNT = 3;
const ADMIN_ROLE = "admin";
function canRetry(count: number) {
return count < MAX_RETRY_COUNT;
}
function isAdmin(role: string) {
return role === ADMIN_ROLE;
}
名前が付くことで、値の意味が分かります。
定数化するメリット
| メリット | 説明 |
|---|---|
| 意味が分かる | 値の目的を名前で読める |
| 変更漏れを減らす | 同じ値を1箇所で管理できる |
| タイプミスを減らす | 文字列の打ち間違いを防げる |
| 検索しやすい | 関連箇所を見つけやすい |
特に権限名、ステータス、制限値、時間、料金、URLなどは定数化を検討します。
何でも定数化しない
すべての数値を定数にすればよいわけではありません。
const ONE = 1;
const ZERO = 0;
このような定数は、意味を増やしていません。1 や 0 が一般的な計算や配列の添字として使われるだけなら、そのままでよいこともあります。
定数名の付け方
定数名には、値そのものではなく意味を入れます。
| 悪い名前 | よい名前 |
|---|---|
THREE | MAX_RETRY_COUNT |
TEN_SECONDS | REQUEST_TIMEOUT_MS |
ADMIN | ADMIN_ROLE |
URL | USER_API_URL |
名前を見て、どこで使う値か分かるようにします。
まとめ
マジックナンバーやマジック文字列は、値の意味がコード上に出ていない状態です。
変更される可能性がある値、業務ルールを表す値、複数箇所で使う値には、意味のある名前を付けましょう。