有時候你可能會在條件判斷中,根據不同的物件型別(通常是基類的一系列子類,或介面的一系列實現),提供相應的邏輯和演算法。
當出現大量型別檢查和判斷時,if else(或switch)語句的體積會比較臃腫,這無疑降低了**的可讀性。
另外,if else(或switch)本身就是乙個「變化點」,當需要擴充套件新的物件型別時,我們不得不追加if else(或switch)語句塊,以及相應的邏輯,這無疑降低了程式的可擴充套件性,也違反了物件導向的ocp原則。
基於這種場景,我們可以考慮使用「多型」來代替冗長的條件判斷,將if else(或switch)中的「變化點」封裝到子類中。這樣,就不需要使用if else(或switch)語句了,取而代之的是子類多型的例項,從而使得**的可讀性和可擴充套件性提高了——這就是本文要介紹的重構策略「使用多型代替條件判斷」。
這個重構策略比較容易理解,下面這幅圖演示了它的重構過程(綠色表示重構前,紅色表示重構後)。
這個重構也常見於一些設計模式,例如:「策略者模式」(指物件的某個行為,在某個場景中,該行為有不同的實現演算法)。
這段**定義了4個類,employee和nonemployee是customer的子類,orderprocessor類根據不同的客戶型別和訂單商品處理訂單折扣。
可以看到,processorder()
方法的可讀性較差,也比較難以維護。
如果某些客戶型別不再使用了,它裡面的一些分支判斷就變成了無效的**。
如果擴充套件新的客戶型別,processorder()
方法的邏輯需要變更,if else語句塊也會越來越大。
我們使用多型代替條件判斷來重構。
重構後,由於discountpercentage封裝在customer類和其子類中了,所以processorder()
方法就無需去判定customer物件的真正型別了。
即使擴充套件新的customer型別,processorder()
方法也不用修改,而只需要繼承customer類並實現discountpercentage屬性,這也符合物件導向的ocp原則。
}小酌重構系列目錄彙總
關注keepfool
小酌重構系列 12 去除上帝類
神說 要有光 就有了光。聖經 上帝要是會寫程式,他寫的類一定是 上帝類 程式設計師不是上帝,不要妄想成為上帝,但程式設計師可以寫出 上帝類 上帝是唯一的,上帝的光芒照耀人間,上帝是很愛面子的,他知道程式設計師寫了 上帝類 搶了他的風頭,於是他降下神罰要懲戒程式設計師。既然你寫了 上帝類 那麼就將你流...
小酌重構系列 17 提取工廠類
在程式中建立物件,並設定物件的屬性,是我們長幹的事兒。當建立物件需要大量的重複 時,看起來就不那麼優雅了。從類的職責角度出發,業務類既要實現一定的邏輯,還要負責物件的建立,業務類幹的事兒也忒多了點。物件建立也是 一件事 我們可以將 這件事 從業務 中提取出來,讓專門的類去做 這件事 這個專門的類一般...
小酌重構系列 21 避免雙重否定
在自然語言中,雙重否定表示肯定。但是在程式中,雙重否定會降低 的可讀性,使程式不易理解,容易產生錯覺。人通常是用 正向思維 去理解一件事情的,使用雙重否定的判斷,需要開發者以 逆向思維 的方式去理解它的含義。另外,在寫程式時,符號很容易被疏忽和遺漏,一不小心則會編寫出錯誤的 從而產生bug。所以,在...