1. 程式人生 > >重構手法30:Replace Type Code with Class (以類取代型別碼)

重構手法30:Replace Type Code with Class (以類取代型別碼)

類之中有一個數值型別碼,但它並不影響類的行為。以一個新的類替換該數值型別碼。

動機:在以C為基礎的程式語言中,型別碼或列舉值很常見。如果帶著一個有意義的符號名,型別碼的可讀性還不錯。問題在於,符號名終究只是個別名,編譯器看見的、進行型別檢驗的,還是背後那個數值。任何接受型別碼作為引數的函式,所期望的實際上是一個數值,無法強制使用符號名。這會大大降低程式碼的可讀性,從而成為bug之源。

如果把那樣的數值換成一個類,編譯器就可以對這個類進行型別檢驗。只要為這個類提供工廠函式,你就可以始終保證只有合法的例項才會被常見出來,而且他們都會被傳遞給正確的宿主物件。

但是,在使用Replace Type Code with Class (以類取代型別碼)之前,你應該先考慮型別碼的其他替換方式。只有當型別碼是純粹資料時(也就是型別碼不會在switch語句中引起行為變化時),你才能以類來取代它。更重要的是:任何switch語句都應該運用Replace Conditional with Polymorphism (以多型取代條件表示式)去掉。為了進行那樣的重構,你首先必須運用 Replace Type Code with Subclass (以子類取代型別碼)或Replace Type Code with State/Strategy (以狀態策略取代型別碼),把型別碼處理掉。

即使一個型別碼不會因其數值的不同而引起行為上的差異,宿主類中的某些行為還是可能更適合放置於型別碼類中,因此你還應該留意是否有必要使用Move Method(搬移函式)將一兩個函式搬過去。

Motivation

ü  型別碼不是型別安全的,終究只是一堆數字或者一個字串。使用類代替型別碼,可以做更好的編譯檢查。 ü  如果型別碼不影響宿主類的行為,則優先考慮使用Replace Type Code with Class Mechanics ü  為型別碼建立一個類。類中應該定義一組靜態變數,表示允許被建立的例項。 ü  修改源類實現,將型別碼替換為上面新建的類。