10-2
関心事ごとにクラスを分けて名付ける
会話の中で「取得時の」「償却後の」と形容詞付きで区別され始めたら、それはもう別々の関心事。1つの変数を使い回して文脈で読み分けさせるのではなく、形容詞ごと名前にしたクラスへ分ける。
固定資産の「取得原価」と「償却後の帳簿価額」
✕ Bad
class Asset:
def __init__(self, cost: int) -> None:
self.value = cost # この時点では取得原価
def apply_depreciation(self, accumulated: int) -> None:
# 呼んだ後の value は「償却後の帳簿価額」に変わる
self.value -= accumulated✓ Good
@dataclass(frozen=True)
class AcquisitionCost:
"""取得原価"""
amount: int
def __post_init__(self) -> None:
if self.amount <= 0:
raise ValueError("取得原価は正の金額")
@dataclass(frozen=True)
class DepreciatedBookValue:
"""償却後の帳簿価額"""
amount: int
@classmethod
def of(cls, cost: AcquisitionCost, accumulated_depreciation: int) -> "DepreciatedBookValue":
return cls(cost.amount - accumulated_depreciation)「会話では形容詞で区別しているのに、コードでは同じ名前を使い回している」状態は、クラスを分けるチャンス。分けておけば、償却計算の仕様変更が取得原価側に波及しない。