2008年3月8日 星期六

M02 令人感到麻煩的設計(10)──讓Class無法被繼承

Package Interface無論如何都會有一個Class實作,如果現在的需求明確地知道只有一種實作的可能時,相信大多數的人都會直接佈置一個Class,因為這是最快完成需要的方式。(圖1)此時我們先假設Interface裡有20個Mehod。

過了一陣子有不同的專案需求,其中7個Mehod需要改寫,為了快速的reuse,很多人會選擇直接繼承原有的Class後再覆寫那7個需求變更的方法。(圖2)再後來,又有一個新的專案需要改寫,但這次是前次變更的7個Method有兩個要與最原始那個一樣,這時一樣是繼承前一個Class再把2個Method從最早的那個複製過來。(圖3)


達到功能需求的變更這是最快的作法沒錯,但是有沒有覺得哪裡怪怪的?PackageImpl與PackageImpl_2裡有兩個方法是完全相同的;PackageImpl裡擁有的20個方法與PackageImpl_1擁有的7個方法沒法立即得知哪些被後面的Class覆寫。Class越多時同樣的狀況到處都有,恐怕連自己都會搞不清楚當初的佈置是怎樣。

雖然OO語言裡Class是允許被繼承的,但是為了避免這種混淆發生,我打算將所有Class都宣告為final,讓特性都繼承自描述用的Abstract Class。

沒有留言:

張貼留言