名前設計
10-6

Manager / Processor に逃げない

Manager、Processor、Controller は「何をするクラスか」を何も語らない万能の名前。「とりあえず Manager に置こう」が積み重なると、無関係な処理が際限なく集まって巨大クラス化する。目的の数だけクラスを分け、それぞれに目的の名前を付ける。

何でも吸い込む AccountingManager

Bad

仕訳・税計算・CSV出力・督促メール・バックアップ——「会計を管理する」という名前の下に何でも集まってくる

万能名のクラスは巨大化が運命
class AccountingManager:
    def post_journal_entry(self, entry: JournalEntry) -> None: ...

    def calculate_consumption_tax(self, period: Period) -> int: ...

    def export_trial_balance_csv(self, period: Period) -> Path: ...

    def send_payment_reminder(self, client_id: str) -> None: ...

    def backup_database(self) -> None: ...
Good

目的ごとにクラスを分ければ、それぞれの名前が「ここに置いてよいロジック」の境界線になる

目的の数だけクラスを分ける
class GeneralLedger:
    """総勘定元帳。仕訳の転記だけを扱う"""
    def post(self, entry: JournalEntry) -> None: ...


class ConsumptionTaxReturn:
    """消費税申告。税額計算だけを扱う"""
    def __init__(self, period: Period) -> None: ...
    def tax_due(self) -> int: ...


class TrialBalanceCsvExporter:
    """試算表のCSV出力だけを扱う"""
    def export(self, period: Period) -> Path: ...

Manager に新メソッドを足したくなったら「この処理の本当の目的は何か」を一度言葉にしてみる。その言葉がそのまま新しいクラス名になる。

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

Manager / Processor に逃げない

Manager、Processor、Controller は「何をするクラスか」を何も語らない万能の名前。「とりあえず Manager に置こう」が積み重なると、無関係な処理が際限なく集まって巨大クラス化する。目的の数だけクラスを分け、それぞれに目的の名前を付ける。

何でも吸い込む AccountingManager

Bad

仕訳・税計算・CSV出力・督促メール・バックアップ——「会計を管理する」という名前の下に何でも集まってくる

万能名のクラスは巨大化が運命
class AccountingManager:
    def post_journal_entry(self, entry: JournalEntry) -> None: ...

    def calculate_consumption_tax(self, period: Period) -> int: ...

    def export_trial_balance_csv(self, period: Period) -> Path: ...

    def send_payment_reminder(self, client_id: str) -> None: ...

    def backup_database(self) -> None: ...
Good

目的ごとにクラスを分ければ、それぞれの名前が「ここに置いてよいロジック」の境界線になる

目的の数だけクラスを分ける
class GeneralLedger:
    """総勘定元帳。仕訳の転記だけを扱う"""
    def post(self, entry: JournalEntry) -> None: ...


class ConsumptionTaxReturn:
    """消費税申告。税額計算だけを扱う"""
    def __init__(self, period: Period) -> None: ...
    def tax_due(self) -> int: ...


class TrialBalanceCsvExporter:
    """試算表のCSV出力だけを扱う"""
    def export(self, period: Period) -> Path: ...

Manager に新メソッドを足したくなったら「この処理の本当の目的は何か」を一度言葉にしてみる。その言葉がそのまま新しいクラス名になる。

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