「触ると壊れるコード」第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 達人に学ぶソフトウェアの構造と設計
👉 依存を減らす設計の考え方が理解しやすいです
※上記リンクはアマゾンアソシエイトを利用しています
次回予告
👉 「まとめ:なぜ“触ると壊れるコード”になるのか」
シリーズ全体を整理します。
ひとこと
👉 共有したその状態、本当に安全ですか?
いいなと思ったら応援しよう!
応援お願いします!
より良い情報を提供できるよう活動費に使わせていただきます。