設計を蝕む悪魔たち
9-3

マジックナンバーで意図を隠さない

ロジックに直接書かれた説明なき数値は、実装した本人にしか意図がわからない。さらに同じ数値が複数箇所にコピーされがちで、税率改正のような変更時に「どこを直すべきか」を grep で特定できず、修正漏れがそのままバグになる。数値には必ず名前を与え、定義箇所を1つにする。

報酬の源泉徴収計算に散らばる裸の数値

Bad

0.1021 や 1_000_000 の意味が読めないうえ、別の関数が段階税率を考慮し忘れている

意図不明な数値の散在と修正漏れ
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

税率と閾値に名前を付けて定義を1箇所に集め、計算ロジックも1本に寄せる

名前のついた定数と単一の計算ロジック
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 のように、散在した数値は「直し忘れたコピー」というバグそのものを生む。

参考: 『良いコード/悪いコードで学ぶ設計入門』(ミノ駆動 著、技術評論社)第9章。コード例は原則を自分の題材で表現し直したオリジナル。
9-3

マジックナンバーで意図を隠さない

ロジックに直接書かれた説明なき数値は、実装した本人にしか意図がわからない。さらに同じ数値が複数箇所にコピーされがちで、税率改正のような変更時に「どこを直すべきか」を grep で特定できず、修正漏れがそのままバグになる。数値には必ず名前を与え、定義箇所を1つにする。

報酬の源泉徴収計算に散らばる裸の数値

Bad

0.1021 や 1_000_000 の意味が読めないうえ、別の関数が段階税率を考慮し忘れている

意図不明な数値の散在と修正漏れ
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

税率と閾値に名前を付けて定義を1箇所に集め、計算ロジックも1本に寄せる

名前のついた定数と単一の計算ロジック
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 のように、散在した数値は「直し忘れたコピー」というバグそのものを生む。

参考: 『良いコード/悪いコードで学ぶ設計入門』(ミノ駆動 著、技術評論社)第9章。コード例は原則を自分の題材で表現し直したオリジナル。