見出し画像

「触ると壊れるコード」第3回:関数を分けたら壊れた話

「整理しただけなのに…」

実務あるある

👉 処理が長い
👉 関数に分ける
👉 読みやすくする

結果

👉 呼び出し順で壊れる


元のコード

def process_order(order):
    order["price"] *= 0.9
    order["tax"] = order["price"] * 0.1

    print(order)

👉 シンプル
👉 ちゃんと動く


よくある改善

👉 「関数分けよう」

def apply_discount(order):
    order["price"] *= 0.9

def apply_tax(order):
    order["tax"] = order["price"] * 0.1

def process_order(order):
    apply_discount(order)
    apply_tax(order)

    print(order)

👉 スッキリした
👉 読みやすくなった

👉 一見よさそう


ここで1行修正

別の人がこう変える

def process_order(order):
    apply_tax(order)       # ← 順番変更
    apply_discount(order)

    print(order)

何が起きるか

👉 税額が変わる


なぜ?

割引後に税計算

変更後

税計算後に割引

🔥 ここが本質

関数を分けたことで

👉 順番依存が見えにくくなった


元のコードは

👉 上から読めば流れが分かった


分割後は

👉 「どの順番が正しいか」が関数名だけでは分からない


結果

👉 呼び出し順で壊れる

👉 関数を分けただけでは安全にならない


今日のポイント

👉 関数分割 = 依存が消えるわけではない


📚 もう一歩深く理解したい人へ

👉 「じゃあどう分ければいいの?」と思った人へ

  • Effective Python 第3版
    👉 副作用・順番依存を減らす考え方が学べます

  • Clean Architecture 達人に学ぶソフトウェアの構造と設計
    👉 責任と依存の整理がかなり理解しやすいです

※上記リンクはアマゾンアソシエイトを利用しています


実務だとこうなる

  • 初期化順で壊れる

  • 呼び出し順で結果が変わる

  • 共通関数化したら逆に追いにくくなる

👉 全部同じ構造


次回予告

👉 「ifを追加したら壊れた話」


ひとこと

👉 この2つの関数、順番変えても安全ですか?

いいなと思ったら応援しよう!

saku|技術メモ 応援お願いします! より良い情報を提供できるよう活動費に使わせていただきます。