悪しき構造の弊害
1-2

ネストした条件分岐の迷宮

「条件を満たすときだけ処理を進める」つもりで if を重ねると、本来やりたい処理がネストの最深部に沈む。どこからどこまでが各 if のブロックなのか目で追うのが難しくなり、条件を1つ足すたびにさらに深くなる。分岐構造を正確に理解しないまま仕様変更すれば、そのままバグになる。

01 確定申告の電子申告を送信できるかの判定

Bad

送信できる条件を if で積み上げた結果、肝心の送信処理が3段ネストの奥に埋まっている

条件を重ねるほど深くなるネスト
def submit_tax_return(self) -> None:
    # 申告期間内か
    if self.is_within_filing_period():
        # 全帳票の検算が済んでいるか
        if self.all_forms_validated:
            # 電子証明書が有効か
            if self.certificate.is_valid():
                self.transmit()

第1章ではまず「これが読みにくさとバグの温床になる」と知覚するところまで。条件を反転して先に抜ける早期 return による解消は、第6章のトピック1で扱う。

02 else がどの if と対なのか追えなくなる

Bad

ネストが深まると if と else の対応を目視で照合する作業が発生する。行が離れるほど取り違えやすく、修正事故の原因になる

if と else の対応が遠い
def build_filing_status(self) -> str:
    if self.is_within_filing_period():
        if self.all_forms_validated:
            if self.certificate.is_valid():
                status = "送信可能"
            else:
                status = "電子証明書の更新が必要"
        else:
            status = "検算未了の帳票あり"
    else:
        status = "申告期間外"
    return status

各ブロックの中身が数十行に育つと、対応する else は画面の遥か下に行ってしまう。この構造のまま条件を追加し続けたコードは実在し、読む者の時間と気力を奪う。

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

ネストした条件分岐の迷宮

「条件を満たすときだけ処理を進める」つもりで if を重ねると、本来やりたい処理がネストの最深部に沈む。どこからどこまでが各 if のブロックなのか目で追うのが難しくなり、条件を1つ足すたびにさらに深くなる。分岐構造を正確に理解しないまま仕様変更すれば、そのままバグになる。

01 確定申告の電子申告を送信できるかの判定

Bad

送信できる条件を if で積み上げた結果、肝心の送信処理が3段ネストの奥に埋まっている

条件を重ねるほど深くなるネスト
def submit_tax_return(self) -> None:
    # 申告期間内か
    if self.is_within_filing_period():
        # 全帳票の検算が済んでいるか
        if self.all_forms_validated:
            # 電子証明書が有効か
            if self.certificate.is_valid():
                self.transmit()

第1章ではまず「これが読みにくさとバグの温床になる」と知覚するところまで。条件を反転して先に抜ける早期 return による解消は、第6章のトピック1で扱う。

02 else がどの if と対なのか追えなくなる

Bad

ネストが深まると if と else の対応を目視で照合する作業が発生する。行が離れるほど取り違えやすく、修正事故の原因になる

if と else の対応が遠い
def build_filing_status(self) -> str:
    if self.is_within_filing_period():
        if self.all_forms_validated:
            if self.certificate.is_valid():
                status = "送信可能"
            else:
                status = "電子証明書の更新が必要"
        else:
            status = "検算未了の帳票あり"
    else:
        status = "申告期間外"
    return status

各ブロックの中身が数十行に育つと、対応する else は画面の遥か下に行ってしまう。この構造のまま条件を追加し続けたコードは実在し、読む者の時間と気力を奪う。

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