你有一個不可變的類型碼,它會影響類的行為。以子類取代這個類型碼。
動機:如果你面對的類型碼不會影響宿主類的行為,可以使用Replace Type Code with Class (以類取代類型碼)來處理它們。但如果類型碼會影響宿主類的行為,那麼最後的辦法就是藉助多態來處理變化行為。
一般來說,這種情況的標誌就是像switch這樣的條件運算式。這種條件運算式可能有2種表現形式:switch語句或者if –then-else結構。不論哪種形式,它們都是檢查類型碼值,並根據不同的值執行不同的動作。這種情況下,你應該以 Replace Conditional with Polymorphism (以多態取代條件運算式)進行重構。但為了那個順利進行那樣的重構,首先應該將類型碼替換為可擁有多態行為的繼承體系。這樣一個繼承體系應該以類型碼宿主類為基類,並針對每一種類型碼建立一個子類。
但是以下2種情況你不能那麼做1)類型碼值在對象建立之後發生了變化;2)由於某種原因,類型碼宿主類已經有了子類。如果你恰好面臨這2種情況之一,就需要運用 Replace Type Code with StateStrategy (以狀態策略取代類型碼)。
Replace Type Code with Subclass (以子類取代類型碼)的主要作用其實是搭建一個舞台,讓Replace Conditional with Polymorphism (以多態取代條件運算式)得以一展身手。如果宿主類中並沒有出現條件運算式,那麼Replace Type Code with Class (以類取代類型碼)更合適,風險也較低。
使用Replace Type Code with Subclass (以子類取代類型碼)的另一個原因是,宿主類中出現了“只與具備特定類型碼之對象相關”的特性。完成本項重構後,你可以使用 push down Method (函數下移)和push down field (欄位下移)將這些特性推到合適的子類中去,以彰顯它們只與特定情況相關這一事實。
Replace Type Code with Subclass (以子類取代類型碼)的好處在於:它把“對不同行為的瞭解”從類使用者那轉移到了類自身。如果需要再加入新的行為變化,只需要添加一個子類就行了。如果沒有多態機制,就必須找到所有條件運算式,並逐一修改它們。因此,如果為了還有可能加入新行為,這項重構將特別有價值。