🎯 什麼情境該想到我
當你遇到「一個函式既回傳一個值、又同時偷偷改變了系統狀態」的時候——你想再叫它一次拿值,卻怕它又造成一次副作用,於是不敢隨便呼叫。
⚙️ 怎麼用(步驟 / 公式)
意圖:遵循「命令與查詢分離」原則——任何有回傳值的函式都應該是純查詢(沒有可觀察的副作用),可以放心任意次數呼叫、任意調換順序。把「回傳值」與「改狀態」拆成兩個函式。
小步安全進行:
- 複製原函式,取一個純查詢用的名字(描述它回傳什麼)。
- 從新的查詢函式中,移除所有會造成副作用的動作,只留下計算與回傳。
- 執行測試。
- 找出每個呼叫原函式的地方,改成:先呼叫查詢函式取值,再呼叫原函式執行副作用(原函式改為不回傳值的修改器)。
- 每改一處就測一次,最後把原函式的回傳值移除。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 有些既定慣用法(如某些並行結構下的「取出並移除」)刻意把查詢與修改綁在一起,強拆反而破壞原子性——這類情況不適用。
- 若拆開後兩個函式必須各自重跑昂貴的計算,需權衡效能。
🔗 相關工具
- 移除旗標參數 Remove Flag Argument(同屬讓函式職責更明確的手法)
- 提煉函式 Extract Function(拆分過程常需把查詢部分提煉出來)
- 重構