最近有位同事和我聊到他做的幾個案子,都略有差異,但因為這些差異讓原來的程式一改再改,很難共用。
這正是重構存在的真正意義呀!
最簡單的重構是從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有篇非常優秀的簡報。
這正是重構存在的真正意義呀!
最簡單的重構是從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有篇非常優秀的簡報。
留言
例如 A B class 都有某個 method ,現在為了抽出這個 method 而新增一個類別 C 並讓 A B 繼承之,然而這個類別 C 的存在僅僅是為了讓 A B 可以共用該 method ,像這樣的 class 多起來之後,整個系統就會變得很亂,可能還比繼承前糟糕。