🎯 什麼情境該想到我
當你「有一份任何角落都能存取、也都能修改的全域資料,出問題時完全查不出是誰改的」的時候——包括全域變數、類別的靜態欄位、單例(singleton)裡的可變狀態。
⚙️ 怎麼用(步驟 / 公式)
這味道是什麼徵兆:全域資料的問題在於「從任何地方都能被改,卻沒有任何機制能看出是哪段碼改的」。它像看不見的暗流,讓 bug 極難重現與定位,且會在整份程式碼裡製造隱形耦合。作者稱它為「最刺鼻的味道之一」。
通常用哪些重構手法對治:
- 封裝變數(Encapsulate Variable):把全域資料藏到一個函式(或一小組函式)後面,所有存取都得經過它。這樣你就有了單一的攔截點,能控管、記錄、限制修改,日後也更容易搬移或改結構。
封裝後,進一步可縮小可見範圍、把「誰能改」限制到最少。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 全域的「常數」(不可變)沒有這個問題,反而是好東西——味道來自「可變」。
- 封裝能大幅降低風險,但無法完全消除全域帶來的耦合;能縮小作用域就縮小。
🔗 相關工具
- 可變資料 Mutable Data(全域資料的危害核心正是「可變」)
- 中間人 Middle Man(過度封裝也可能走向另一個極端)
- 重構