10-7
動詞まじりのクラス名を分解する
add_entry_to_journal のような「動詞+目的語」の長い名前が必要になるのは、よそのクラスの関心事を抱え込んでいるサイン。目的語を名詞のままクラスに昇格させ、メソッドは動詞1語で済むように設計し直す。
担当者クラスが仕訳帳の都合を抱え込む
✕ Bad
class Accountant:
def add_entry_to_journal(
self, journal: list[JournalEntry], entry: JournalEntry
) -> bool:
# 仕訳帳の締めルールを担当者が知ってしまっている
if entry.date <= self.closed_until:
return False
journal.append(entry)
return True✓ Good
@dataclass(frozen=True)
class Journal:
closed_until: date
entries: tuple[JournalEntry, ...] = ()
def add(self, entry: JournalEntry) -> "Journal":
if entry.date <= self.closed_until:
raise ClosedPeriodError(entry.date)
return Journal(self.closed_until, (*self.entries, entry))Journal.add(entry) は「仕訳帳に追加する」と英文のまま読める。動詞1語で書けないメソッドが増えてきたら、クラスの切り方そのものを見直す合図。