March 21 15:16~16:14
不是說好要少用繼承嗎?
昨天上「Design Patterns這樣學就會了–入門實作班」,講完Template Method設計模式之後Teddy問學員:「GoF不是說Favor object composition over class inheritance,但Template Method卻使用class inheritance,為什麼?你們能不能用object composition 達到Template Method的效果?」
圖1是Teddy上課時設計的Template Method範例,鄉民們一起想想看,如何用object composition來取代Template Method。
▲圖1:Template Method類別圖
***
不使用繼承的設計
圖2是使用object composition取代class inheritance的設計,原本Template Method所呼叫的primitive operations或是hook operations改呼叫實作Operation的具體類別,請參考圖3程式碼。
▲圖2:用object composition取代class inheritance (套用Command設計模式取代Template Method)
▲圖3:圖2中的ConfigParser程式示意範例
***
哪種設計比較好?
如果只從Favor object composition over class inheritance的觀點來思考,圖2套用Command設計模式的設計比較好。但是,請數一下這兩個設計所需要的類別/介面數量:
- Template Method:如圖1所示需要3個類別:
- Command:參考圖3,ConfigParser與Operation這兩個是固定的,要分別支援從檔案與資料庫讀取設定資料,所以需要兩種DataSource實作,因此最少需要 1 + 1 + 2 + 4 = 8個類別/介面。
從Kent Beck的建單設計(Simple Design)原則來看:
- Passes the Tests
- Reveals Intention
- No Duplication
- Fewest Elements
第4條:最少元素,達到相同的功能,在這個例子裏面Template Method(class inheritance)用了3個「元素」,而Command(object composition)則用了至少8個「元素」,因此在這裡用Template Method的設計應該是比較簡單的設計。
***
友藏內心獨白:繼承不是不能用。
沒有留言:
張貼留言