不変の活用
4-3

可変インスタンスの使い回しが生む事故

書き換え可能なオブジェクトを複数の持ち主で共有すると、片方への変更がもう片方にも波及する。コード上は別々の持ち主に見えるのに実体は同じ1個、という状態は、変更した本人にも気づけない遠隔バグになる。少なくとも持ち主ごとに別インスタンスを生成して共有を断つ。

部門予算インスタンスの共有

Bad

同じ Budget インスタンスを2部門に渡したため、営業部の増額が管理部の予算まで変えてしまう

1つの可変インスタンスを2か所で共有
class Budget:
    def __init__(self, amount: int) -> None:
        self.amount = amount

class Department:
    def __init__(self, name: str, budget: Budget) -> None:
        self.name = name
        self.budget = budget

shared = Budget(1_000_000)
sales = Department("営業部", shared)
admin = Department("管理部", shared)

sales.budget.amount += 200_000  # 営業部だけ増額したつもり
print(admin.budget.amount)      # 1_200_000 — 管理部まで増えている
Good

部門ごとに Budget を生成し、インスタンスの共有をやめる

持ち主ごとに別インスタンス
sales = Department("営業部", Budget(1_000_000))
admin = Department("管理部", Budget(1_000_000))

sales.budget.amount += 200_000
print(admin.budget.amount)  # 1_000_000 のまま

インスタンスを分けても Budget 自体はまだ可変で、どこからでも amount を書き換えられる構造は残っている。共有を断つのは応急処置で、根本対策はトピック4・5で扱う「不変にする」こと。

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

可変インスタンスの使い回しが生む事故

書き換え可能なオブジェクトを複数の持ち主で共有すると、片方への変更がもう片方にも波及する。コード上は別々の持ち主に見えるのに実体は同じ1個、という状態は、変更した本人にも気づけない遠隔バグになる。少なくとも持ち主ごとに別インスタンスを生成して共有を断つ。

部門予算インスタンスの共有

Bad

同じ Budget インスタンスを2部門に渡したため、営業部の増額が管理部の予算まで変えてしまう

1つの可変インスタンスを2か所で共有
class Budget:
    def __init__(self, amount: int) -> None:
        self.amount = amount

class Department:
    def __init__(self, name: str, budget: Budget) -> None:
        self.name = name
        self.budget = budget

shared = Budget(1_000_000)
sales = Department("営業部", shared)
admin = Department("管理部", shared)

sales.budget.amount += 200_000  # 営業部だけ増額したつもり
print(admin.budget.amount)      # 1_200_000 — 管理部まで増えている
Good

部門ごとに Budget を生成し、インスタンスの共有をやめる

持ち主ごとに別インスタンス
sales = Department("営業部", Budget(1_000_000))
admin = Department("管理部", Budget(1_000_000))

sales.budget.amount += 200_000
print(admin.budget.amount)  # 1_000_000 のまま

インスタンスを分けても Budget 自体はまだ可変で、どこからでも amount を書き換えられる構造は残っている。共有を断つのは応急処置で、根本対策はトピック4・5で扱う「不変にする」こと。

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