🎯 什麼情境該想到我
當你發現「程式各處都在對同一個特殊值(最常見的是 null,或某個代表『查無此人/預設客戶』的值)重複做相同的檢查與處理」的時候。
⚙️ 怎麼用(步驟 / 公式)
意圖:用一個「特例物件」把該特殊值的預設行為封裝起來(null 的情況即 Null Object 模式)。這樣呼叫端就能像對待一般物件那樣使用它,不必再到處寫 if (x == null) ...——把散落的特例處理集中成一個物件的固有行為。
小步安全進行:
- 為容器類別加一個「是否為特例」的檢查方法(如
isUnknown()),初期回傳固定值。 - 建立特例物件(如
UnknownCustomer),讓它的isUnknown()回傳 true,並讓來源在「查無」時回傳這個特例物件。 - 找出所有「檢查該特例值」的重複程式碼,逐一改用新的檢查方法。
- 對每一段特例處理,把它的預設回應搬進特例物件成為其方法(如特例客戶的名字固定回傳 “occupant”)。
- 每搬一段就執行測試,直到呼叫端不必再自行判斷特例。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 若各處對這個特殊值的處理其實各不相同(沒有共通的預設行為),封裝成單一特例物件反而不合適。
- 只有一兩處檢查、不構成重複時,殺雞用牛刀。
🔗 相關工具
- 以多型取代條件式 Replace Conditional with Polymorphism(特例物件常是多型體系裡的一員)
- 搬移函式 Move Function(把特例的預設行為搬進特例物件)
- 重構