l

2016年2月15日 星期一

用Extract Method與Extract Class移除Duplicated Code怪味道

Feb. 05 10:30~10:58

image

▲Duplicate cat可以移除嗎?

 

Duplicated Code怪味道在〈談談壞味道(1):Duplicated Code〉介紹過,今天介紹如何用Extract MethodExtract Class來移除這個怪味道。首先看程式範例,你有FileUtil與HttpDownload兩個類別,你注意到在finally statement裡面關閉IO物件的程式碼在這兩個類別裡面都很類似:如果IO物件不是null,則呼叫它的close()函數。呼叫close()可能會拋出IOException,在這種狀況下已經「無藥可醫」,所以你決定忽略它(好一點的做法可以把例外log下來)。

螢幕截圖 2016-02-05 17.47.44

螢幕截圖 2016-02-05 17.47.30

 

要怎麼移除finally敘述中的重覆程式碼?

***

首先套用Extract Method,把關閉IO物件的程式碼抽離出來放到close()函數裡面:

螢幕截圖 2016-02-05 17.49.31

然後將FileUtil與HttpDownload類別裡面關閉IO物件的地方改成呼叫close()函數:

螢幕截圖 2016-02-05 17.50.10

螢幕截圖 2016-02-05 17.50.16

***

改到這裡程式已經乾淨多了,但是FileUtil與HttpDownload類別裡面分別都有一個close()函數。這時候可以套用Extract Class,新增一個Cleaner類別,然後把close()函數移到它裡面。

螢幕截圖 2016-02-05 17.51.47

 

最後讓FileUtil與HttpDownload類別改呼叫Cleaner裡面的close()函數。

螢幕截圖 2016-02-05 17.52.28

螢幕截圖 2016-02-05 17.52.37


***

友藏內心獨白:到目前為止都很簡單。

1 則留言: