重構手法31:Replace Type Code with Subclass (以子類取代類型碼)

來源:互聯網
上載者:User

 

你有一個不可變的類型碼,它會影響類的行為。以子類取代這個類型碼。

動機:如果你面對的類型碼不會影響宿主類的行為,可以使用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 (以子類取代類型碼)的好處在於:它把“對不同行為的瞭解”從類使用者那轉移到了類自身。如果需要再加入新的行為變化,只需要添加一個子類就行了。如果沒有多態機制,就必須找到所有條件運算式,並逐一修改它們。因此,如果為了還有可能加入新行為,這項重構將特別有價值。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.