重構(gòu)(名詞):對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整沛鸵,目的是在不改變軟件可觀察行為的前提下制轰,提高其可理解性。降低其修改成本均澳。
重構(gòu)(動詞):使用一系列重構(gòu)手法恨溜,在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu)找前。
一糟袁、重構(gòu),第一個案例
如果你發(fā)現(xiàn)自己需要為程序添加一個特性躺盛,而代碼結(jié)構(gòu)使你無法很方便地達成目的项戴,那就先重構(gòu)那個程序,使特性的添加比較容易進行槽惫,然后再添加特性周叮。
重構(gòu)前,先檢查自己是否有一套可靠的測試機制界斜。這些測試必須有自我檢驗?zāi)芰Α?/b>
進行重構(gòu)的時候仿耽,我們需要依賴測試,讓它告訴我們是否引入了bug各薇。好的測試是重構(gòu)的根本项贺。
重構(gòu)步驟的本質(zhì):重構(gòu)技術(shù)就是以微小的步伐修改程序。如果你犯下錯誤峭判,很容易便可發(fā)現(xiàn)它开缎。
任何一個傻瓜都能寫出計算機可以理解的代碼。唯有寫出人類容易理解的代碼林螃,才是優(yōu)秀的程序員奕删。
二、重構(gòu)原則
為何重構(gòu):1疗认、重構(gòu)改進軟件設(shè)計完残;2砌滞、重構(gòu)使軟件更容易理解;3坏怪、重構(gòu)幫助找到bug;4绊茧、重構(gòu)提高編程速度铝宵;
何時重構(gòu):1、三次法則(事不過三华畏,三則重構(gòu))鹏秋;2、添加功能時重構(gòu)亡笑;3侣夷、修補錯誤時重構(gòu);4仑乌、復(fù)審代碼時重構(gòu)百拓;
間接層是把雙刃劍,間接層的價值:1晰甚、允許邏輯共享衙传;2、分開解釋意圖和實現(xiàn)厕九;3蓖捶、隔離變化;4扁远、封裝條件邏輯俊鱼;
三、代碼的壞味道
1畅买、重復(fù)代碼(Duplicated Code)
2铁材、過長函數(shù)(Long Method)
3、過大的類(Large Class)
4绢涡、過長參數(shù)列(Long Parameter List)
5瞄桨、發(fā)散式變化(Divergent Change)
6、散彈式修改(Shotgun Surgery)
7洒宝、依戀情節(jié)(Feature Envy)
8购公、數(shù)據(jù)泥團(Data Clumps)
9、基本類型偏執(zhí)(Primitive Obsession)
10雁歌、switch驚悚現(xiàn)身(Switch Statements)
11宏浩、平行繼承體系(Parallel Inheritance Hierarchies)
12、冗贅類(Lazy?Class)
13靠瞎、夸夸其談未來性(Speculative Generality)
14比庄、令人迷惑的暫時字段(Temporary Field)
15求妹、過度耦合的消息鏈(Message Chains)
16、中間人(Middle Man)
17佳窑、狎昵關(guān)系(Inappropriate?Intimacy)
18制恍、異曲同工的類(Alternative?Classes?with?Different?Interfaces)
19、不完美的庫類(Incomplete?Library?Class)
20神凑、純稚的數(shù)據(jù)類(Data Class)
21净神、被拒絕的遺贈(Refused Bequest)
22、過多的注釋(Comments):當你感覺需要撰寫注釋時溉委,請先嘗試重構(gòu)鹃唯,試著讓所有注釋都變得多余。