不変の活用
4-2

引数への再代入をやめる

受け取った引数に別の意味の値を上書きすると、その行以降は変数名が嘘をつき始める。「申請額」という名前の変数に合計額が入っている、という食い違いは読み手の予想を裏切り、ログや後続の計算で静かに事故を起こす。引数は読み取り専用とみなし、別の意味の値には新しい変数を立てる。

経費申請の月次上限チェック

Bad

引数 amount に累計額を上書きした結果、後続の行で「申請額」として表示される値が壊れる

引数の上書きで名前と中身がずれる
MONTHLY_LIMIT = 300_000

def accept_expense(amount: int, monthly_total: int) -> None:
    # 申請額だったはずの amount が、ここから先は累計額になる
    amount = monthly_total + amount
    if MONTHLY_LIMIT < amount:
        raise ValueError("月次の経費上限を超えています")
    # 申請額のつもりで累計額が表示されてしまう
    print(f"申請額 {amount:,} 円を受け付けました")
Good

累計の見込み額には専用の変数を立て、引数はそのまま使い切る

引数は読み取り専用
MONTHLY_LIMIT = 300_000

def accept_expense(amount: int, monthly_total: int) -> None:
    projected_total = monthly_total + amount
    if MONTHLY_LIMIT < projected_total:
        raise ValueError("月次の経費上限を超えています")
    print(f"申請額 {amount:,} 円を受け付けました")

Java では引数に final を付けて再代入そのものを禁止できる。Python では機械的に止める手段がないぶん、「引数には代入しない」を習慣として徹底する。引数を加工したくなったら、それは別の概念が生まれたサインなので新しい名前を付ける。

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

引数への再代入をやめる

受け取った引数に別の意味の値を上書きすると、その行以降は変数名が嘘をつき始める。「申請額」という名前の変数に合計額が入っている、という食い違いは読み手の予想を裏切り、ログや後続の計算で静かに事故を起こす。引数は読み取り専用とみなし、別の意味の値には新しい変数を立てる。

経費申請の月次上限チェック

Bad

引数 amount に累計額を上書きした結果、後続の行で「申請額」として表示される値が壊れる

引数の上書きで名前と中身がずれる
MONTHLY_LIMIT = 300_000

def accept_expense(amount: int, monthly_total: int) -> None:
    # 申請額だったはずの amount が、ここから先は累計額になる
    amount = monthly_total + amount
    if MONTHLY_LIMIT < amount:
        raise ValueError("月次の経費上限を超えています")
    # 申請額のつもりで累計額が表示されてしまう
    print(f"申請額 {amount:,} 円を受け付けました")
Good

累計の見込み額には専用の変数を立て、引数はそのまま使い切る

引数は読み取り専用
MONTHLY_LIMIT = 300_000

def accept_expense(amount: int, monthly_total: int) -> None:
    projected_total = monthly_total + amount
    if MONTHLY_LIMIT < projected_total:
        raise ValueError("月次の経費上限を超えています")
    print(f"申請額 {amount:,} 円を受け付けました")

Java では引数に final を付けて再代入そのものを禁止できる。Python では機械的に止める手段がないぶん、「引数には代入しない」を習慣として徹底する。引数を加工したくなったら、それは別の概念が生まれたサインなので新しい名前を付ける。

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