14-2
意味単位にロジックを並べ直す
ネストをほぐしても、検証のコードと結果を組み立てるコードが交互に出てくると、読み手は2つの関心事を行ったり来たりさせられる。「まず全部の検証、次に組み立て」と意味のまとまりごとに行を並べ直すだけで、処理の構成が段落として読めるようになる。
検証と記録づくりが交互に現れる貸出登録
✕ Bad
def register_loan(member: Member, book: Book) -> LoanRecord:
if not member.is_active:
raise LoanError("利用停止中の会員です")
member_id = member.id
due_date = date.today() + LOAN_PERIOD
if not book.in_stock:
raise LoanError("この蔵書は貸出中です")
book_id = book.id
if len(member.loans) >= LOAN_LIMIT:
raise LoanError("同時貸出の上限に達しています")
return LoanRecord(member_id=member_id, book_id=book_id, due_date=due_date)✓ Good
def register_loan(member: Member, book: Book) -> LoanRecord:
if not member.is_active:
raise LoanError("利用停止中の会員です")
if not book.in_stock:
raise LoanError("この蔵書は貸出中です")
if len(member.loans) >= LOAN_LIMIT:
raise LoanError("同時貸出の上限に達しています")
return LoanRecord(
member_id=member.id,
book_id=book.id,
due_date=date.today() + LOAN_PERIOD,
)行の入れ替えは「順序を変えても結果が同じ」と確認できた範囲でのみ行う。途中の代入が後続の条件に影響していないかを見極め、テストで挙動の不変を担保しながら少しずつ動かすのがリファクタリングの作法。