🎯 什麼情境該想到我
當你「一份資料在很多地方被修改,改著改著在某個沒預期的角落引發錯誤」的時候——你很難再確定某個時刻它到底是什麼狀態。
⚙️ 怎麼用(步驟 / 公式)
這味道是什麼徵兆:對資料的修改常導致難以預料的後果與難查的 bug——你在一處改了值,卻在另一個看似無關的地方爆炸。函數式程式設計的觀念是資料永不改變、更新即產生新副本;現實中不必極端,但要盡量控制「可變」的範圍與入口。
通常用哪些重構手法對治:
- 封裝變數(Encapsulate Variable):讓所有更新都經過少數幾個函式,方便監控與演進。
- 將查詢與修改分離(Separate Query from Modifier):確保「取值」的函式沒有副作用,能安心呼叫。
- 以查詢取代暫時變數(Replace Temp with Query):減少會被反覆賦值的中間變數。
- 搭配移除設值函式(Remove Setting Method)、拆分變數(Split Variable)(一個變數別身兼多職)。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 完全不可變在效能或現實上未必可行;目標是「縮小並看管」可變範圍,不是消滅所有變動。
- 一個變數若在不同階段承載不同意義,先用拆分變數釐清,別急著封裝。
🔗 相關工具
- 全域資料 Global Data(可變 × 全域 是最危險的組合)
- 神秘命名 Mysterious Name(身兼多職的變數往往也名字不清)
- 重構