条件分岐
6-1

早期returnでネスト解消

条件を満たす場合だけ処理を進めようとして if を重ねると、本来やりたい処理がネストの最深部に埋もれてしまう。「満たさないなら即 return」と条件を反転して並べれば、却下条件と本処理が分離されて読みやすくなる。

経費精算の承認判定

Bad

承認できる条件を if で重ねた結果、本処理が4段ネストの奥に埋まっている

ネストした条件分岐
def approve_expense(report: ExpenseReport | None) -> str:
    result = ""
    if report is not None:
        if report.amount <= 50_000:
            if report.has_receipt:
                if report.applicant.is_active:
                    result = "approved"
                else:
                    result = "rejected: applicant inactive"
            else:
                result = "rejected: no receipt"
        else:
            result = "rejected: over limit"
    return result
Good

却下条件を先頭でガードして抜ける。最後まで残ったものだけが承認される

早期returnでフラット化
def approve_expense(report: ExpenseReport | None) -> str:
    if report is None:
        return "rejected: no report"
    if report.amount > 50_000:
        return "rejected: over limit"
    if not report.has_receipt:
        return "rejected: no receipt"
    if not report.applicant.is_active:
        return "rejected: applicant inactive"
    return "approved"

Python ではガード節(guard clause)として定着している書き方。却下条件の追加・削除が1行単位でできるので、承認ルールの仕様変更にも強い。

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

早期returnでネスト解消

条件を満たす場合だけ処理を進めようとして if を重ねると、本来やりたい処理がネストの最深部に埋もれてしまう。「満たさないなら即 return」と条件を反転して並べれば、却下条件と本処理が分離されて読みやすくなる。

経費精算の承認判定

Bad

承認できる条件を if で重ねた結果、本処理が4段ネストの奥に埋まっている

ネストした条件分岐
def approve_expense(report: ExpenseReport | None) -> str:
    result = ""
    if report is not None:
        if report.amount <= 50_000:
            if report.has_receipt:
                if report.applicant.is_active:
                    result = "approved"
                else:
                    result = "rejected: applicant inactive"
            else:
                result = "rejected: no receipt"
        else:
            result = "rejected: over limit"
    return result
Good

却下条件を先頭でガードして抜ける。最後まで残ったものだけが承認される

早期returnでフラット化
def approve_expense(report: ExpenseReport | None) -> str:
    if report is None:
        return "rejected: no report"
    if report.amount > 50_000:
        return "rejected: over limit"
    if not report.has_receipt:
        return "rejected: no receipt"
    if not report.applicant.is_active:
        return "rejected: applicant inactive"
    return "approved"

Python ではガード節(guard clause)として定着している書き方。却下条件の追加・削除が1行単位でできるので、承認ルールの仕様変更にも強い。

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