🎯 什麼情境該想到我
當你用「一個型別碼欄位」(如 type = "engineer" / "manager",或一個列舉、數字)來區分物件是哪一種,而且不同種類其實還帶有各自不同的行為或欄位的時候。
⚙️ 怎麼用(步驟 / 公式)
意圖:把型別碼換成一個子類別階層——每一種類型變成一個子類別。這麼做打開了兩扇門:一是能用多型讓各類型自己管自己的行為(後續施以以多型取代條件式),二是能讓「只屬於某種類型」的欄位落在對應子類別,不再污染共用結構。
小步安全進行:
- 先封裝型別碼欄位(用存取器包起來),執行測試。
- 為某個型別值建立子類別;若無法直接用建構式建立子類,改用工廠函式回傳適當子類。
- 讓該子類別的型別碼取值方法回傳對應的固定值,並把建立這種類型的地方改為產生此子類別。
- 逐一為其他型別值重複,每加一個子類別就執行測試。
- 全部搬完後,把只屬於某類型的欄位與行為下移到對應子類別。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 若型別碼在物件生命週期中會改變(今天是 A 明天變 B),子類別化就不適用(物件無法變更自己的類別)——此時改用以委派取代子類。
- 各類型之間若沒有行為差異、純粹只是標籤,引入子類階層是過度設計。
🔗 相關工具
- 以多型取代條件式 Replace Conditional with Polymorphism(有了子類別後,把依型別的 switch 改成多型)
- 提煉超類 Extract Superclass(反向思考:先有多個類別再抽共同父類)
- 重構