名前設計
10-2

関心事ごとにクラスを分けて名付ける

会話の中で「取得時の」「償却後の」と形容詞付きで区別され始めたら、それはもう別々の関心事。1つの変数を使い回して文脈で読み分けさせるのではなく、形容詞ごと名前にしたクラスへ分ける。

固定資産の「取得原価」と「償却後の帳簿価額」

Bad

同じ value が、メソッドを呼ぶ前は取得原価、呼んだ後は償却後の帳簿価額。呼び出し順を知らないと読めない

1つの変数に2つの意味が同居
class Asset:
    def __init__(self, cost: int) -> None:
        self.value = cost  # この時点では取得原価

    def apply_depreciation(self, accumulated: int) -> None:
        # 呼んだ後の value は「償却後の帳簿価額」に変わる
        self.value -= accumulated
Good

会話に出てくる2つの概念がそれぞれ名前を持ち、どの時点の金額なのかが型で確定する

形容詞ごとクラスに昇格
@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)

「会話では形容詞で区別しているのに、コードでは同じ名前を使い回している」状態は、クラスを分けるチャンス。分けておけば、償却計算の仕様変更が取得原価側に波及しない。

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

関心事ごとにクラスを分けて名付ける

会話の中で「取得時の」「償却後の」と形容詞付きで区別され始めたら、それはもう別々の関心事。1つの変数を使い回して文脈で読み分けさせるのではなく、形容詞ごと名前にしたクラスへ分ける。

固定資産の「取得原価」と「償却後の帳簿価額」

Bad

同じ value が、メソッドを呼ぶ前は取得原価、呼んだ後は償却後の帳簿価額。呼び出し順を知らないと読めない

1つの変数に2つの意味が同居
class Asset:
    def __init__(self, cost: int) -> None:
        self.value = cost  # この時点では取得原価

    def apply_depreciation(self, accumulated: int) -> None:
        # 呼んだ後の value は「償却後の帳簿価額」に変わる
        self.value -= accumulated
Good

会話に出てくる2つの概念がそれぞれ名前を持ち、どの時点の金額なのかが型で確定する

形容詞ごとクラスに昇格
@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)

「会話では形容詞で区別しているのに、コードでは同じ名前を使い回している」状態は、クラスを分けるチャンス。分けておけば、償却計算の仕様変更が取得原価側に波及しない。

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