l

2014年5月14日 星期三

談談壞味道(11):Alternative Classes with Different Interfaces

May 07 15:00~15:51

螢幕截圖 2014-05-07 15.49.59

 

Alternative Classes with Different Interfaces

這個壞味道的名字很長,但《Refactoring》書中對它的說明卻很短。嚴格講起來書中並沒有說明,而是直接告訴讀者要套用那些重構技巧來移除這個壞味道。Alternative是替代、在若干個裡面選一個的意思,Alternative Classes就是有若干個在功能上可以彼此取代對方的類別,加上後面Different Interfaces,這個壞味道就是說「有若干個在功能上可以彼此取代對方的類別,但這些類別的介面並不相同」。中文版的《Refactoring》翻譯成「異曲同工的類別」

當很多人一同開發系統的時候,不同人可能寫出類似的程式碼來處理相同的問題,但是由於溝通不良,彼此並沒有留意到這種現象。因此這些功能相似或是相同的程式碼,以不同的介面(名稱或參數不同)同時存在於系統中。讀到這裡鄉民們應該可以發現,Alternative Classes with Different Interfaces算是Duplicated Code的另一種形式,兩個類別(或函數)也許程式碼內容並非一模一樣,但是功能上卻是相同。

Teddy以前經常遇到這樣的壞味道,例如在程式中需要把一段字串依據某些token拆成不同子字串。有些開發人員可能會直接用Java字串物件加上正規表示法來處理,有些人會自己寫split()公用函數,也有人寫出功能一樣,但是名稱叫做subString()的函數。針對相同的功能, 如果可以有一種統一的做法,對於日後維護、擴充系統以及除錯,都會比較容易。

***

綜合以上的說明,Alternative Classes with Different Interfaces之所以會是一個bad smell的原因(force)可歸類為:understandability、modifiability和testability(增加測試工作量)這三點。

移除Alternative Classes with Different Interfaces壞味道的方法,在《Refactoring》書中提到可以套用Rename Method、Move Method和Extract Superclass。

***

友藏內心獨白:異曲(介面)同工(行為)。

沒有留言:

張貼留言