見出し画像

「触ると壊れるコード」第6回:状態を共有したら壊れた話

「そこまで変えるつもりなかったのに…」

実務あるある

👉 状態を共有した
👉 一部だけ変更した

結果

👉 別の処理まで変わる


元のコード

def search_items():
    filters = {
        "category": "book",
        "sort": "new",
        "limit": 50
    }

    print("本検索:", filters)

def preview_items():
    preview_filters = {
        "category": "book",
        "sort": "popular",
        "limit": 10
    }

    print("プレビュー:", preview_filters)

👉 本検索は新着順
👉 プレビューは人気順

それぞれ別の条件を使っています。


改善

「共通部分が多いからまとめよう」

そう思って、検索条件を共通化します。

filters = {
    "category": "book",
    "sort": "new",
    "limit": 50
}

def search_items():
    print("本検索:", filters)

def preview_items():
    preview_filters = filters

    preview_filters["sort"] = "popular"
    preview_filters["limit"] = 10

    print("プレビュー:", preview_filters)

👉 category は共通
👉 必要な部分だけ変更

一見、自然な改善に見えます。


バグ発生

search_items()
preview_items()
search_items()

結果

本検索: {'category': 'book', 'sort': 'new', 'limit': 50}

プレビュー: {
    'category': 'book',
    'sort': 'popular',
    'limit': 10
}

本検索: {
    'category': 'book',
    'sort': 'popular',
    'limit': 10
}

「なんで?」

原因はここです

preview_filters = filters

これはコピーではありません。

👉 preview_filters と filters が
👉 同じ辞書を見ています

つまり

preview_filters["sort"] = "popular"

と書くと、preview_filters だけではなく、
元の filters も変わります。


🔥 ここが本質

状態を共有すると、
一部だけ変更したつもりでも、別の処理まで変わります。

今回でいうと

preview_filters["sort"] = "popular"
preview_filters["limit"] = 10

これはプレビュー用の変更に見えます。

でも実際は

👉 共通の filters を直接変更しています。


今日のポイント

👉 共有状態は“見えない依存”になる

search_items() は普通に検索しているだけに見えます。

でも実際には、共有された filters に依存しています。

だから preview_items() が filters を変更すると、
search_items() の結果まで変わります。


実務だとこうなる

  • プレビュー条件が本検索に残る

  • 一部変更のつもりが全体に効く

  • どこで条件が変わったか分からない

  • 修正すると別画面が壊れる

👉 全部同じ構造です。


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

「状態ってどこに持つべき?」と思った人へ

  • Effective Python 第3版
    👉 状態共有・副作用の危険性を理解するのに参考になります

  • Clean Architecture 達人に学ぶソフトウェアの構造と設計
    👉 依存を減らす設計の考え方が理解しやすいです

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


次回予告

👉 「まとめ:なぜ“触ると壊れるコード”になるのか」

シリーズ全体を整理します。


ひとこと

👉 共有したその状態、本当に安全ですか?

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

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