Mistake #51 : Magic Numbers

自分だけの
「秘密の暗号」

日記帳に書いた「今日は8が起きた」という一文。
あなたには意味が分かるでしょう。
しかし、5年後のあなたや、それを読む他人は「8って何だ?」と永遠に悩み続けます。

🔢 暗号解読診断
  • `if (status == 9)` というようなコードが至る所にある
  • 「99はその他、0は未設定」など、独自の番号ルールがドキュメント化されていない
  • 消費税率などの変動する値も、直接数字(1.10)で書いている
  • 「この数字は何?」と聞かれて、即答できないものが3つ以上ある
⚠️ 警告:あなたのプログラムは、論理ではなく「呪文」で動いています。
呪文の意味を知る魔術師(あなた)がいなくなった瞬間、システムは修正不能になります。

01. 突然現れる「8」とか「3」

if (user.type == 3) {
  price = price * 0.9;
}

このコードを見て、「3」が何を表しているか分かりますか?
ゴールド会員? 社員? それともブラックリスト?
「0.9」も謎です。1割引? 税抜き計算?
このように、ソースコード内に直接書き込まれた意味不明な数字を「マジックナンバー(魔法の数字)」と呼びます。
プログラムは動きますが、読む人にとっては解読不能な暗号です。

数字に「名前」を与えよ。
それはコードへの「命」の吹き込みだ。

02. 変更時の地獄

もし「ユーザータイプ3」の意味が変わり、番号が「4」になったとします。
マジックナンバーで書いていると、プロジェクト内の数千ファイルから「3」という数字を検索し、
それが「ユーザータイプの3」なのか「個数の3」なのかを目視で判断して置換しなければなりません。
これはもはや、地雷撤去作業に近いストレスです。
間違いなく、いくつかの「3」は見逃され、いくつかの無関係な「3」が誤って書き換えられます。

03. 定数(Constant)を使う

解決策は簡単です。数字に名前をつける(定数化する)ことです。
`const USER_TYPE_VIP = 3;`
`const DISCOUNT_RATE = 0.9;`
こう定義しておけば、コードは `if (user.type == USER_TYPE_VIP)` となり、誰でも意味が理解できます。
もし値が変わっても、定数の定義を1箇所変えるだけで、全ての箇所の修正が完了します。
「名前をつける」というたった数秒の手間が、未来の数百時間を救うのです。

執筆:コードレビュー委員会

1行のコードに込められた意図を厳しく審査するゲートキーパー。
「推測させない」「探させない」コーディング規約の番人。