🎯 什麼情境該想到我
當你看到「依物件的型別(type code)做 switch / if-else 分支」,而且同樣一組分支在程式各處反覆出現、每加一種新類型就得回頭改好幾個地方的時候。
⚙️ 怎麼用(步驟 / 公式)
意圖:把「依型別分支的條件邏輯」交給類別繼承與多型來處理。為每一種類型建立子類別,讓各子類別覆寫自己的行為;呼叫端只管呼叫方法,由多型自動分派到正確的實作。加新類型時只要新增一個子類別,不必去動既有的 switch。
小步安全進行:
- 建立繼承體系:若還沒有子類別,先做以子類取代型別碼(或用工廠函式建立適當子類)。
- 挑一個含 switch 的函式,用函式上移把它搬到超類別。
- 在某個子類別中覆寫該函式,把「屬於這個類型的那條分支」搬進來取代 super 的行為。
- 逐一為其他子類別重複,每搬一條分支就執行測試。
- 所有分支都被子類別覆寫後,把超類別的方法改成預設行為或宣告為抽象。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 只有一兩處簡單分支、且類型很少變動時,直接用條件式更簡單,不必大動干戈引入繼承。
- 這是較重的手法,會引入類別階層;要確定「依型別變化的行為」確實會反覆出現、值得這個結構。
🔗 相關工具
- 以子類取代型別碼 Replace Type Code with Subclasses(常是本手法的前置步驟:先有子類才能談多型)
- 函式上移 Pull Up Method(把共同框架搬到超類別,再讓子類覆寫差異)
- 分解條件式 Decompose Conditional(分支不多時,先分解可能就夠了)
- 重構