必會重構技巧(二) 使用多型替換條件

2022-02-07 01:07:03 字數 2727 閱讀 8777

使用多型替換條件:指在進行型別檢查和執行某些型別操作時,最好將演算法封裝在類中,並且使用多型來對**中的呼叫進行抽象

舉例理解:看定義可能比較迷糊,其實說的簡單一點,對於使用分支語句並且分支條件是和型別檢查相關的程式段,如 if(type == typeof(typea))else if(type == typeof(typeb)),可以把中的code,嘗試放到if的條件中去。然後通過檢查type就可以直接返回需要的東東了,這樣做可以利用已有的繼承層次進行計算,比較便於維護。如果還是覺得說的太抽象,可以看看下面的**感覺一下。

專案例項:用wpf做乙個網遊的客戶端demo,裡面需要對商品,郵件,物品欄做分頁操作。於是手動寫了幾個分頁的類。開始是把分頁的計算方法都寫在了事件裡面的,每乙個button繫結乙個事件,每次需要修改或者使用分頁的時候,都要找到相關類進行修改,複製,各個方法的耦合程度大增,程式可讀性,復用性和可維護性都不太好。雖然這個專案是很久之前做的了,但這裡既然想起來了,覺得還是可以嘗試用這種重構方法,效果如何大家自己看看吧。

先來看看原始的未經過重構的**:

使用多型替換條件:指在進行型別檢查和執行某些型別操作時,最好將演算法封裝在類中,並且使用多型來對**中的呼叫進行抽象

舉例理解:看定義可能比較迷糊,其實說的簡單一點,對於使用分支語句並且分支條件是和型別檢查相關的程式段,如 if(type == typeof(typea))else if(type == typeof(typeb)),可以把中的code,嘗試放到if的條件中去。然後通過檢查type就可以直接返回需要的東東了,這樣做可以利用已有的繼承層次進行計算,比較便於維護。如果還是覺得說的太抽象,可以看看下面的**感覺一下。

專案例項:用wpf做乙個網遊的客戶端demo,裡面需要對商品,郵件,物品欄做分頁操作。於是手動寫了幾個分頁的類。開始是把分頁的計算方法都寫在了事件裡面的,每乙個button繫結乙個事件,每次需要修改或者使用分頁的時候,都要找到相關類進行修改,複製,各個方法的耦合程度大增,程式可讀性,復用性和可維護性都不太好。雖然這個專案是很久之前做的了,但這裡既然想起來了,覺得還是可以嘗試用這種重構方法,效果如何大家自己看看吧。

先來看看原始的未經過重構的**:

原始**

//

x:目標頁數索引值 y:每頁顯示記錄個數 這裡不care你是如何取到這幾個值的和對這兩個int值合法性的驗證

protected

void

btnfirstpage_click(

object

sender, eventargs e)

}protected

void

btnprepage_click(

object

sender, eventargs e)

}protected

void

btnnextpage_click(

object

sender, eventargs e)

}protected

void

btnlastpage_click(

object

sender, eventargs e)

}private

dataset getdata(

inttargetpageindex,

intnumberperpage)

//get date from db

上面的幾段**可以實現功能,但是卻存在以下幾點問題。

(1)如果有多個頁面需要使用分頁,同樣的**需要複製多次,復用性差。

(2)第乙個問題造成了第二個問題,如果需要修改某段方法,那所有的相關頁面都要修改,可維護性差。

(3)相似邏輯的方法寫在了多個事件中,可讀性差。

為了解決這三個問題,現在重構後的**如下:

重構後

public

abstract

class

paging

public

intnumberperpage

public

abstract

dataset datalist

}public

class

firstpage : paging

public

override

dataset datalist}}

public

class

prepage : paging

public

override

dataset datalist}}

public

class

nextpage : paging

public

override

dataset datalist}}

public

class

lastpage : paging

public

override

dataset datalist}}

以上**可以獨立出乙個paging的類,略加修改就可以對應任意的datasource。

前台呼叫**

protected

void

btnpaging_click(

object

sender, eventargs e)

}

個人感覺,對於本例中的應用,好處並不是很明顯,也許是我寫的有問題,也許是我選擇例子有問題。儘管如此,重構的思想體現出來了,那就是把演算法封裝到多型中。此種重構在對於含型別判斷條件的複雜演算法分支的應用上,效果還是比較顯著的。

必會重構技巧(五) 劃分職責

g 劃分職責 根據方法實現的邏輯來安排方法所在的類。舉例理解 這個重構的方法是對單一職責原則 srp 的貫徹,在coding的時候,我們不僅僅需要把方法中的邏輯單一化 主要使用 extract method 還要把類中的方法安置合理化。比如說有個book 的類,那麼對於book的一些操作,如增加減少...

小酌重構系列 14 使用多型代替條件判斷

有時候你可能會在條件判斷中,根據不同的物件型別 通常是基類的一系列子類,或介面的一系列實現 提供相應的邏輯和演算法。當出現大量型別檢查和判斷時,if else 或switch 語句的體積會比較臃腫,這無疑降低了 的可讀性。另外,if else 或switch 本身就是乙個 變化點 當需要擴充套件新的...

CButtonST使用技巧(二)

cbuttonst使用技巧 二 cbuttonst使用技巧 一 介紹了cbuttonst使用的7種技巧,本篇主要包括了以下的效果 1.改變滑鼠進入按鈕時的形狀 超連結效果 2.選單按鈕 3.位圖按鈕 4.按鈕焦點 5.checkbox按鈕 6.透明按鈕 按鈕背景和視窗背景一樣 7.特殊的pictur...