星期日, 7月 05, 2009

不專業之重構心得分享

最近有位同事和我聊到他做的幾個案子,都略有差異,但因為這些差異讓原來的程式一改再改,很難共用。
這正是重構存在的真正意義呀!

最簡單的重構是從Rename Varibale和Rename Method開始,接著熟練後便開始Extract Method,進一步則是Pull Up、Push Down,再來則是Generalize Type。

我自己做時只有兩個原則:異中求同、同中求異。

異中求同是指在不同的method裏找出相同的區塊,萃出成一個method或是公用class(例如有關數值運算、轉型、中文數字等等);或是不同的class中找出相同的行為,extract為有相關的class pattern(例如Factory、Abstract Factory等pattern)。

同中求異是指在複製貼上的動作後,找出相同的區塊做Extract Method,若有許多子類別則可以Pull Up,諸如此類的應用。

所有的書都寫得類似,重構就像開車,一點一點地修正方向盤,慢慢地就安全抵達目的。個人的經驗是每天都寫code,經過幾年後就會不知不覺地學到重構的方法。

這只是在下不專業的看法,正統的重構技巧請看重構:改善既有程式的設計 (二版)

P.S. 我不擅長Web重構,高手jaceju有篇非常優秀的簡報

2 則留言:

snowmantw 提到...

根據我自己些許的經驗,有時為了抽出共同 method,反而會製造許多小而層次不一的類別,而且讓整個繼承線變亂。所以有的時候抽出共用 method 到某一類別似乎有它的底線在。

例如 A B class 都有某個 method ,現在為了抽出這個 method 而新增一個類別 C 並讓 A B 繼承之,然而這個類別 C 的存在僅僅是為了讓 A B 可以共用該 method ,像這樣的 class 多起來之後,整個系統就會變得很亂,可能還比繼承前糟糕。

漢堡 提到...

類別的設計,注重的是該類別的責任有那些,而責任對應到的就是其方法,如果只是為了要泛化方法而另外去建立類別,不見得是一種好的想法,可以試試用委託(delegation)來取代~