4-1
ローカル変数の再代入をやめる
1つの変数に「小計」「税込額」「最終額」と次々に別の意味の値を上書きしていくと、途中のどの時点で何の金額なのかをコードを上から追わないと分からなくなる。計算の各段階に専用の変数名を与えれば、再代入は自然と消え、途中の値もすべて確認できるようになる。
請求書の最終請求額の計算
✕ Bad
def invoice_total(items: list[LineItem], discount: int) -> int:
tmp = sum(item.unit_price * item.quantity for item in items)
# 値引きを反映
tmp = tmp - discount
# 消費税10%を上乗せ
tmp = int(tmp * 1.10)
# 源泉徴収税を差し引く
tmp = tmp - int(tmp * 0.1021)
return tmp✓ Good
def invoice_total(items: list[LineItem], discount: int) -> int:
subtotal = sum(item.unit_price * item.quantity for item in items)
discounted = subtotal - discount
tax_included = int(discounted * 1.10)
withholding = int(tax_included * 0.1021)
return tax_included - withholdingJava なら final を付けて再代入をコンパイルエラーにできるが、Python にその構文はない。代わりに「1変数1役割」を守ればよい。値引前の小計と源泉控除額がそれぞれ名前付きで残るので、請求書のどの行が合わないかをデバッグするときにも途中の金額をそのまま print できる。