利用多型重構為帶參方法

2021-09-05 06:33:21 字數 1283 閱讀 9573

《重構之美》之二

public class worksheet

} public void fillbody()

} }

方法fillheader()和fillbody()的目的都是從物件中獲得字串陣列,然後將其填充到單元格中。區別在於,獲得字串陣列的物件並不相同。前者為header物件,後者為cellgroup物件。我們可以為其提供乙個抽象的介面,以實現**的有效重用:

public inte***ce textdatasource

然後,讓header和cellgroup類均實現該介面。由於cellgroup並沒有直接定義返回字串陣列的方法,而是通過返回的cell物件獲得text值,因此,需要將這部分實現封裝到gettextarea()方法中:

public class header implements textdatasource

} public class cellgroup implements textdatasource

return textarea.toarray();

} }

現在,就可以重構原有的worksheet類了。

public class worksheet

} }

具體需要填充什麼內容,可以在呼叫fillsheet()方法時,根據傳入的引數物件來決定。經過重構之後,worksheet類中的重複**得到了移除,且具有了更好的擴充套件性。

這一重構手法與parameterize method要解決的壞味道相似,同樣對相似方法提取了共同的引數,但實現的本質完全不同。它利用了多型的原理,通過對抽象方法體中的相似物件,抹去了不同型別物件之間的差異性,使得方法體中的相似結構能夠被抽取出來。

我將這一重構手法命名為parameterize method by polymorphism。讓我仿照martin fowler的風格,給出這一重構方式的作法(mechanics):

1)新建乙個介面,並使原有方法中的差異物件實現該介面。

2)如果原有物件的方法與該介面定義的方法簽名不同,則運用rename method。

3)編譯。

4)新建乙個引數為新介面型別的方法,使它可以替換先前所有的重複方法。

5)編譯。

6)將對舊方法的呼叫替換為對新函式的呼叫。

7)編譯,測試。

8)對所有舊方法重複上述步驟,每次替換後,修改並測試

如果在呼叫新方法時,發現建立引數實參物件是一件麻煩事,可以考慮在原有類中引入乙個建立新介面物件的工廠方法,從而對複雜的建立邏輯進行封裝。

利用多型重構為帶參方法

重構之美 之二 public class worksheet public void fillbody 方法fillheader 和fillbody 的目的都是從物件中獲得字串陣列,然後將其填充到單元格中。區別在於,獲得字串陣列的物件並不相同。前者為header物件,後者為cellgroup物件。我...

執行緒使用方法 帶參 不帶參 執行緒類

現在c 已經建議擯棄使用 suspend,resume 暫停 恢復執行緒,也盡量少用 abort方法中斷乙個執行緒.建議使用執行緒的同步手段有 mutex manualresetevent autoresetevent,monitor.下面再對此進行詳細描述.thread類的建構函式有2類 一種是不...

帶參方法與包和static final

帶參方法定義的一般形式 訪問修飾符 返回型別 方法名 引數列表 引數的概念 形參是在定義方法時對引數的稱呼 實參是在呼叫方法時傳遞給方法的實際的值 呼叫帶參方法時要求實參與形參要匹配 乙個引數可以有多個引數但只能有乙個返回值 呼叫方法時不能指定實參型別!形參和實參資料型別要一致!形參和實參數量要一致...