跳到主要內容

不專業之重構心得分享

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

最簡單的重構是從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有篇非常優秀的簡報

留言

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

例如 A B class 都有某個 method ,現在為了抽出這個 method 而新增一個類別 C 並讓 A B 繼承之,然而這個類別 C 的存在僅僅是為了讓 A B 可以共用該 method ,像這樣的 class 多起來之後,整個系統就會變得很亂,可能還比繼承前糟糕。
漢堡寫道…
類別的設計,注重的是該類別的責任有那些,而責任對應到的就是其方法,如果只是為了要泛化方法而另外去建立類別,不見得是一種好的想法,可以試試用委託(delegation)來取代~

這個網誌中的熱門文章

自然人憑證讀卡機驅動程式

鳥毅用的是第一代的自然人憑證讀卡機,EZ100PU(後來有同事買EZmini可以讀SIM卡似乎更好),每年報稅時用一次。 本來只是要申請些政府業務,一時之間找不到光碟,沒想到在 驅動程式下載 居然看到Linux和Mac的驅動程式,剩下的就是政府單位的網頁和程式應該改版了吧!!!

DBeaver 介面語言

DBeaver是我個人頗常用的一套跨平台Database管理工具,最近升級後發現Windows版本居然變成簡體中文,而且無法切換為英文。

如何將較高版本SQL Server複製到低版本SQL Server (降級為舊版)並保留權限及資料庫圖表

一般若是要將SQL Server裡的Database轉往其他Server時,最簡單的方式就是備份(Backup)後再還原(Restore),或者是䣃離(detach)後附加(attach)。 但是很不幸地,若是由較低版本(e.g. 2008)到較高版本(e.g. 2012)要怎麼辦呢?