l

2014年4月25日 星期五

談談壞味道(6):Switch Statements & Parallel Inheritance Hierarchies

Mar. 24 19:31~21:20

螢幕截圖 2014-03-24 21.09.05

 

Switch Statements(Switch敘述)

鄉民們可能聽過類似的說法:「好的物件導向程式應該少用switch statements」,根據《Refactoring》書上的講法,switch statements會造成重複(duplication),因為很容易在程式中發現同樣的switch statements散布在不同的地方。但Teddy覺得對物件導向的程式來講,duplication應該是switch statements造成的第二嚴重問題,首要的問題應該是違反了open-closed principle,也就是降低modifiability。無論是duplicated code也好,是違反open-closed principle也罷,這兩者都會降低modifiability。

Switch statements還有另外一個問題是當switch statements很長,尤其是每一個case子句當中還有複雜邏輯的程式,則會降低testability。

關於switch statements也可以參考c2網站上面的討論。

***

綜合以上的說明,switch statements之所以會是一個bad smell的原因(force)可歸類為:modifiability和testability這兩點。

移除switch statements壞味道的方法,在《Refactoring》書中提到可以套用Extract Method、Move Method、Replace Type Code with Subclasses、Replace Type Code with State/Strategy、Replace Conditional with Polymorphism、Replace parameter with Explicit Methods、Introduce Null Object。

***

Parallel Inheritance Hierarchies(平行繼承架構)

《Refactoring》書上說parallel inheritance hierarchies是shotgun surgery的特殊情況,因為兩個平行的繼承架構彼此相關,因此當在某個繼承架構中增加了一個subclass,也必須為另一個繼承架構新增一個相對應的subclass。學過GoF Design Patterns的人一看就知道Factory Method與Abstract Factory這兩個設計模式就是標準的parallel inheritance hierarchies。

但是話說回來,《Refactoring》書上對於這個壞味道的說明實在太少也太抽象,不太容易理解。後來參考了《Refactoring in Large Software Projects》和《Refactoring Workbook》這兩本書才比較清楚一些,請參考下圖:

螢幕截圖 2014-03-24 21.01.02

 

看完這個圖之後雖然移除了parallel inheritance hierarchies,但是一旦右邊的類別多了一個subclass,左邊的類別還是會新增一個class,只不過這個class透過composition的方式去使用相對應的那個subclass。這樣做真的有比parallel inheritance hierarchies要來的好嗎?這個問題當成作業請鄉民們自行思考看看挑眉質疑(PS:也可以參考stackoverflow的討論)。

***

既然parallel inheritance hierarchies是shotgun surgery的特殊情況,造成它之所以會是一個bad smell的原因(force)應該也和shotgun surgery一樣可歸類為:modifiability、testability、understandability這三點。

移除parallel inheritance hierarchies壞味道的方法,在《Refactoring》書中提到可以套用Move Method和Move Field。

***

友藏內心獨白:針對Factory Method和Abstract Factory應該沒轍吧。

沒有留言:

張貼留言