条件分岐
6-2

else を早期 return で消す

if-elif-else で結果を一時変数に詰めてから最後に return する書き方は、「この変数が途中で書き換わるかもしれない」という疑いを最後の行まで読者に持たせ続ける。条件が成立したらその場で return すれば else 自体が不要になり、各しきい値が独立した1行として並ぶ。

予算消化率からアラート区分を決める

Bad

elif-else の連鎖と一時変数。どの分岐がどの値を入れたか、最後まで追わないと確定しない

一時変数に詰めて最後に返す
def budget_alert_level(used: Decimal, budget: Decimal) -> AlertLevel:
    usage_rate = used / budget

    level: AlertLevel
    if usage_rate >= 1:
        level = AlertLevel.OVERRUN
    elif usage_rate >= Decimal("0.9"):
        level = AlertLevel.WARNING
    elif usage_rate >= Decimal("0.7"):
        level = AlertLevel.CAUTION
    else:
        level = AlertLevel.NORMAL
    return level
Good

条件が決まった瞬間に return。else が消え、しきい値の対応表のように読める

早期 return で else を排除
def budget_alert_level(used: Decimal, budget: Decimal) -> AlertLevel:
    usage_rate = used / budget

    if usage_rate >= 1:
        return AlertLevel.OVERRUN
    if usage_rate >= Decimal("0.9"):
        return AlertLevel.WARNING
    if usage_rate >= Decimal("0.7"):
        return AlertLevel.CAUTION
    return AlertLevel.NORMAL

topic 1 のガード節と同じ発想を「値を返す分岐」に適用した形。新しいしきい値(例: 80% で注意喚起メール)を足すときも差分は1行で済み、一時変数の初期化漏れや代入漏れという事故そのものが起きなくなる。

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

else を早期 return で消す

if-elif-else で結果を一時変数に詰めてから最後に return する書き方は、「この変数が途中で書き換わるかもしれない」という疑いを最後の行まで読者に持たせ続ける。条件が成立したらその場で return すれば else 自体が不要になり、各しきい値が独立した1行として並ぶ。

予算消化率からアラート区分を決める

Bad

elif-else の連鎖と一時変数。どの分岐がどの値を入れたか、最後まで追わないと確定しない

一時変数に詰めて最後に返す
def budget_alert_level(used: Decimal, budget: Decimal) -> AlertLevel:
    usage_rate = used / budget

    level: AlertLevel
    if usage_rate >= 1:
        level = AlertLevel.OVERRUN
    elif usage_rate >= Decimal("0.9"):
        level = AlertLevel.WARNING
    elif usage_rate >= Decimal("0.7"):
        level = AlertLevel.CAUTION
    else:
        level = AlertLevel.NORMAL
    return level
Good

条件が決まった瞬間に return。else が消え、しきい値の対応表のように読める

早期 return で else を排除
def budget_alert_level(used: Decimal, budget: Decimal) -> AlertLevel:
    usage_rate = used / budget

    if usage_rate >= 1:
        return AlertLevel.OVERRUN
    if usage_rate >= Decimal("0.9"):
        return AlertLevel.WARNING
    if usage_rate >= Decimal("0.7"):
        return AlertLevel.CAUTION
    return AlertLevel.NORMAL

topic 1 のガード節と同じ発想を「値を返す分岐」に適用した形。新しいしきい値(例: 80% で注意喚起メール)を足すときも差分は1行で済み、一時変数の初期化漏れや代入漏れという事故そのものが起きなくなる。

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