🎯 什麼情境該想到我
當你看到「用一個布林(或列舉)旗標參數去決定函式要走哪種行為」的時候——呼叫端寫著 setDinner(true),光看呼叫根本猜不出 true 是什麼意思。
⚙️ 怎麼用(步驟 / 公式)
意圖:旗標參數會隱藏函式之間的行為差異,也讓呼叫端難以讀懂。把「靠旗標切換的一個函式」拆成幾個各自意圖明確的具名函式,讓呼叫端直接呼叫它要的那一個。
小步安全進行:
- 針對旗標的每一種取值,建立一個明確命名的專用函式(如
deliveryDate拆成regularDeliveryDate與rushDeliveryDate)。 - 讓每個新函式內部帶著固定的旗標值去呼叫原函式(或直接內嵌對應那條分支的邏輯)。
- 找出呼叫端,依它傳入的旗標值,逐一改呼叫對應的專用函式。
- 每改一處就執行測試;全部改完後,若原函式已無人使用可考慮移除。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 若旗標會有多個、組合起來爆炸成一堆函式,拆分反而失控——此時保留參數(或改用參數物件)較合理。
- 當旗標值是在執行期才動態決定、無法在呼叫端寫死時,拆成具名函式的好處會打折。
🔗 相關工具
- 將查詢與修改分離 Separate Query from Modifier(同屬讓函式職責單一、意圖明確的手法)
- 移除死程式碼 Remove Dead Code(拆分後常暴露出走不到的分支可清除)
- 重構