🎯 什麼情境該想到我
當你「一個類別承擔了太多責任、越長越大」的時候——尤其當裡面有一小群欄位和方法明顯自成一組、常一起變動——把這組相關的資料與行為抽出來,成立一個新的類別,讓每個類別的職責更單純。
⚙️ 怎麼用(步驟 / 公式)
意圖:一個類別責任太多時,把其中一組相關的欄位與方法抽出成新類別。
動作要點(小步安全進行):
- 決定要如何切分職責,確認哪一組欄位與方法該搬出去。
- 建立一個新(子)類別來承接被分出的責任;若舊類別改名更貼切也一併處理。
- 在舊類別中建立指向新類別實例的連結(一個欄位)。
- 用「搬移欄位」把相關欄位一個個移到新類別,每步測試。
- 用「搬移函式」把相關方法移到新類別(先移被呼叫端、再移呼叫端),每步測試。
- 檢視兩邊介面,去掉不再需要的部分,並決定新類別要對外公開到什麼程度。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 若抽出後新類別責任太薄、幾乎沒剩什麼,代表切過頭,該反向做內聯類別 Inline Class。
- 對治的壞味道:龐大類別(Large Class)、資料泥團(Data Clumps)。
- 反向手法:內聯類別 Inline Class。
🔗 相關工具
- 內聯類別 Inline Class(本手法的反向操作)
- 隱藏委託關係 Hide Delegate(抽出新類別後,常用它隱藏對客戶端的委託)
- 引入參數物件 Introduce Parameter Object(成群資料先聚成物件,往往是提煉類別的前奏)
- 重構