重構-改善既有代碼的設計(十一)--處理歸納關係

前言

有一批重構手法專門用來處理歸納關係(即繼承關係),主要是將函數上下移動於繼承體系之中字段上移和方法上移都用於將特性向繼承體系的上端移動,字段下移和方法下移則將特性向繼承體系的下端移動。構造函數比較難以向上拉動,所以專門有一個構造函數本體上移處理它,通常不會將構造函數往下推,由於以工廠函數取代構造函數一般更管用。java

字段上移

問題

兩個子類擁有相同的字段函數

方法

將該字段上移繼承

動機

既然是相同字段就應該放在父類中接口

函數上移

問題

有些函數,在各個子類中產生徹底相同的效果模板

方法

將該函數移至超類泛型

動機

相同效果的方法應該能夠作成一個方法吧。重構

構造函數本體上移

問題

在各個子類中擁有一些構造函數,他們的本體幾乎徹底一致構造函數

方法

在超類中新建一個構造函數,並在子類構造函數中調用它方法

動機

又是重複代碼。。。數據

函數下移

問題

超類中的某個函數只與部分(而非所有)子類有關

方法

將這個函數移到相關的子類去

動機

這個就是依戀關係。直接遷移函數

字段下移

問題

超類中的某個字段只被部分(而非所有)子類用到

方法

將這個字段移到須要它的那些子類去

動機

這個就是依戀關係。直接遷移字段

提煉子類

問題

類中的某些特性只被某些(而非所有)實例用到

方法

新建一個子類,將上面所說的那一部分特性移到子類中

動機

說明這個類並非只作一件事。並且還比較重。須要拆分

提煉超類

問題

兩個類有類似的特性

方法

爲這兩個類創建一個超類,將相同特性移至超類

動機

用父類來封裝類似的特性,用子類來新特性

# 提煉接口

問題

若干客戶使用類接口中的同一子集,或者兩個類的接口有部分相同

方法

將相同的子集提煉到一個獨立的接口中

動機

同上

摺疊繼承體系

問題

超類和子類之間沒有太大的區別

方法

將它們合爲一體

動機

根據具體狀況而用

塑造模板函數

問題

有一些子類,其中相應的某些函數以相同順序執行相似的操做,但各個操做的細節上有所不一樣

方法

將這些操做分別放進獨立函數中,並操持它們都有相同的簽名,因而原函數也就變得相同了,而後將原函數上移至超類。

動機

好比java的泛型,就是模板函數,可以大大減小代碼重複

以委託取代繼承

問題

某個子類只使用超類接口中的一部分,或是根本不須要繼承而來的數據

方法

在子類中新建一個字段用以保存超類,調整子類函數,令它改而委託超類,而後去掉二者之間的繼承關係。

動機

若是隻使用方法的話,能夠這樣使用

以繼承取代委託

問題

在兩個類之間使用委託關係,並常常爲整個接口編寫許多極簡單的委託函數。

方法·

讓委託類繼承受託類

動機

太簡單的委託是沒有必要的。只會增長代碼量。

相關文章
相關標籤/搜索