l

2016年3月1日 星期二

用Extract Class移除Large Class怪味道

Feb. 14 21:20~21:58

image

▲圖片來源在此

 

昨天介紹使用Extract Subclass與Extrace Interface重構移除,Large Class怪味道,今天介紹另一個移除Large Class怪味道的重構方法—Extract Class

▼例子和昨天的USBDrive一樣,只不過今天要採用Extract Class重構方法來移除Large Class怪味道。以下這個USBDrive同時支援USB 2.0與USB 3.0,導致類別過於龐大。

螢幕截圖 2016-02-14 21.50.58

***

▼套用Extract Class重構,抽離出一個新的USBController類別。請注意這個類別的getChannelSpeed()函數,它的子類別會提供自己的實作。

螢幕截圖 2016-02-14 21.38.54

 

▼讓USB3Controller繼承自USBController,USB3Controller提供自己得getChannelSpeed()實作。

螢幕截圖 2016-02-14 21.42.03

 

▼原本USB 2.0不需要一個USBController,因此這裡套用Null Object設計模式實作一個NullController類別,將原本USB 2.0的程式碼移到它身上。

螢幕截圖 2016-02-14 21.45.08

 

▼重構後的USBDrive變得很乾淨,它的建構函數接受一個USBController,getSpeedInMegaBit()函數的實作直接委託給這個USBController的instance來處理即可。

螢幕截圖 2016-02-14 21.49.17

***

看完昨天和今天的這兩個類子,相民們有沒有發現Extract Subclass與Extract Class名字很像,功能上都可以達到達到code reuse與去除duplicated code的效用。不同之處在於Extrac Subclass透過繼承(inheritance),而Extract Class則是透過委託(delegation)來達成此目的。

***

友藏內心獨白:Favor object composition over class inheritance。

沒有留言:

張貼留言