9-3
マジックナンバーで意図を隠さない
ロジックに直接書かれた説明なき数値は、実装した本人にしか意図がわからない。さらに同じ数値が複数箇所にコピーされがちで、税率改正のような変更時に「どこを直すべきか」を grep で特定できず、修正漏れがそのままバグになる。数値には必ず名前を与え、定義箇所を1つにする。
報酬の源泉徴収計算に散らばる裸の数値
✕ Bad
def withholding_tax(fee: int) -> int:
if fee <= 1_000_000:
return int(fee * 0.1021)
return int(1_000_000 * 0.1021 + (fee - 1_000_000) * 0.2042)
def net_payment(fee: int) -> int:
# 同じ計算を二重に実装し、100万円超の段階を考慮し忘れている
return fee - int(fee * 0.1021)✓ Good
from decimal import Decimal
from typing import Final
WITHHOLDING_RATE: Final = Decimal("0.1021") # 源泉徴収税率(復興特別所得税込み)
HIGHER_RATE: Final = Decimal("0.2042") # 100万円超の部分に適用する税率
RATE_THRESHOLD: Final = 1_000_000 # 税率が切り替わる報酬額
def withholding_tax(fee: int) -> int:
if fee <= RATE_THRESHOLD:
return int(fee * WITHHOLDING_RATE)
over = fee - RATE_THRESHOLD
return int(RATE_THRESHOLD * WITHHOLDING_RATE + over * HIGHER_RATE)
def net_payment(fee: int) -> int:
return fee - withholding_tax(fee)定数化の効能は「読める」だけではない。税率が改正されたら WITHHOLDING_RATE を1箇所直せば全体に波及し、修正漏れが構造的に起きなくなる。Bad 側の net_payment のように、散在した数値は「直し忘れたコピー」というバグそのものを生む。