🎯 什麼情境該想到我

當你「有一份任何角落都能存取、也都能修改的全域資料,出問題時完全查不出是誰改的」的時候——包括全域變數、類別的靜態欄位、單例(singleton)裡的可變狀態。

⚙️ 怎麼用(步驟 / 公式)

這味道是什麼徵兆:全域資料的問題在於「從任何地方都能被改,卻沒有任何機制能看出是哪段碼改的」。它像看不見的暗流,讓 bug 極難重現與定位,且會在整份程式碼裡製造隱形耦合。作者稱它為「最刺鼻的味道之一」。

通常用哪些重構手法對治:

  • 封裝變數(Encapsulate Variable):把全域資料藏到一個函式(或一小組函式)後面,所有存取都得經過它。這樣你就有了單一的攔截點,能控管、記錄、限制修改,日後也更容易搬移或改結構。

封裝後,進一步可縮小可見範圍、把「誰能改」限制到最少。

🧪 我實際套用的紀錄

  • (待填)

⚠️ 注意 / 什麼時候不適用

  • 全域的「常數」(不可變)沒有這個問題,反而是好東西——味道來自「可變」。
  • 封裝能大幅降低風險,但無法完全消除全域帶來的耦合;能縮小作用域就縮小。

🔗 相關工具