リファクタリング
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

「検証フェーズ→組み立てフェーズ」の2段構成に並べ直す。空行が段落の切れ目になる

意味のまとまりで分離
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,
    )

行の入れ替えは「順序を変えても結果が同じ」と確認できた範囲でのみ行う。途中の代入が後続の条件に影響していないかを見極め、テストで挙動の不変を担保しながら少しずつ動かすのがリファクタリングの作法。

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

「検証フェーズ→組み立てフェーズ」の2段構成に並べ直す。空行が段落の切れ目になる

意味のまとまりで分離
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,
    )

行の入れ替えは「順序を変えても結果が同じ」と確認できた範囲でのみ行う。途中の代入が後続の条件に影響していないかを見極め、テストで挙動の不変を担保しながら少しずつ動かすのがリファクタリングの作法。

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