一、概述
重構(gòu)三部曲為:思想準(zhǔn)備,單元測試,重構(gòu)
- 思想準(zhǔn)備的目的是明確:為什么要重構(gòu),重構(gòu)的理論支撐是什么
- 單元測試:重構(gòu)依托于良好的測試,單元測試是保證重構(gòu)順利進(jìn)行的神兵利器
- 重構(gòu):依照《重構(gòu)》中的重構(gòu)技巧進(jìn)行實戰(zhàn)
本文主要是摘錄自《重構(gòu) 改善既有代碼設(shè)計》的原話,有一部分是個人對原文的個人理解。
重構(gòu)的思想并不是只適用于重構(gòu),也適用于開發(fā)過程中的代碼編寫,兩者的目的都是寫出良好的代碼。
光知道還不夠,還必須付諸應(yīng)用;光有決心還不夠,還必須行動
二、代碼需要意圖明顯
- 重構(gòu)的定義:在不改變軟件可觀察行為的前提下改善其內(nèi)部結(jié)構(gòu)。
- 重構(gòu)的意義在于:你永遠(yuǎn)不必說對不起--只要把出問題的地方修補好就行了。(“封裝”不可能永遠(yuǎn)都是適用的,可能過一段時間之前很完美的封裝就會顯得很“臃腫”了)
- 你的代碼首先是為人寫的,其次才是為計算機寫的,寫出人類容易理解的代碼
- “封裝”意味著每個對象都應(yīng)該盡可能少了解系統(tǒng)的其他部分
- 關(guān)鍵不在于函數(shù)的長度,而在于函數(shù)“做什么”和“如何做”之間的語義距離
- 代碼用途和實現(xiàn)手法之間的語義距離
- 意圖要明確,明確說出我所需要的。
- 提高代碼的可理解性,降低其修改成本
- 避免“代碼傳達(dá)的信息與你的意圖南轅北轍”
- 需要為代碼編寫文檔意味著代碼本身寫的不好
- 函數(shù)的名稱應(yīng)該準(zhǔn)確表達(dá)它的用途
- 好的代碼,更有利于性能的優(yōu)化(不要因為性能而犧牲代碼的清晰性)
三、重構(gòu)要小步前進(jìn)
- 重構(gòu)依托于良好的單元測試。
- “重構(gòu)需要一組可靠的測試環(huán)境”
- 測試應(yīng)該是一種風(fēng)險驅(qū)動行為
- 一定要快速前進(jìn),快速失敗并更正,然后再重復(fù)
- 重構(gòu)應(yīng)該小步前進(jìn),比如修改一個局部變量或者提煉一個函數(shù)
- 每一步出現(xiàn)異常都應(yīng)該回滾上個版本,保證輸出不變
- 設(shè)計模式為重構(gòu)提供了目標(biāo)
- 你之所以進(jìn)行重構(gòu),必定是為了達(dá)到某個目的,而不僅僅是為了看起來有所動作
- 大型重構(gòu)耗費是假長,在這個過程中,你應(yīng)該根據(jù)需要安排自己的工作,只在需要添加新功能或修補錯誤時擦進(jìn)行重構(gòu)。重構(gòu)程度只要能滿足其他任務(wù)的需要就行了
- 應(yīng)對并處理變化,是軟件開發(fā)的根本復(fù)雜性之一
- 重構(gòu)時不應(yīng)該有任何添加功能的操作,重構(gòu)是對已有功能的操作,必須保證軟件可觀察方式(輸出)是不變的。
- 哪怕你完全了解系統(tǒng),也請實際度量它的性能,不要臆測。臆測會讓你學(xué)到一些東西,但十有八九你是錯的。
- 你必須培養(yǎng)出自己的判斷力。
- 問題發(fā)現(xiàn)的越早,為修復(fù)而付出的代價越低。
四、重構(gòu)方法的一些摘錄
- 一個類應(yīng)該是一個清楚的抽象,處理一些明確的責(zé)任
- 決定把責(zé)任放在哪兒
- 分解類所負(fù)的責(zé)任,分解出新類的舊類如果責(zé)任與名稱不符,進(jìn)行更名
- 間接性可能帶來幫助,但非必要的間接性總是讓人不舒服
- 觀察類應(yīng)該做的所有事情,然后針對任何一項功能的任何一種可能失敗情況
- 增加子類的目的,是為了增加新特性或變化其行為
- 如果某個類在不同環(huán)境下扮演截然不同的角色,使用接口就是個好主意
- 絕大多數(shù)情況下,函數(shù)應(yīng)該放在它所使用的數(shù)據(jù)的所屬對象內(nèi)
- 將復(fù)雜的處理過程分解成小函數(shù)
- 先搬離低層函數(shù),再搬離高層函數(shù)
- 將查詢函數(shù)和修改函數(shù)分離
- 所謂重構(gòu)繼承體系,往往是將函數(shù)和字段在體系上下移動
- 如果你手上沒有所需的東西,總可以叫另一個對象給你
- 在分布式軟件中,函數(shù)的往返必須被減至最低限度
- 任何有返回值的函數(shù),都不應(yīng)該有看得到的副作用
-
所有的數(shù)據(jù)都應(yīng)該隱藏起來
- 數(shù)據(jù)隱藏,你絕不應(yīng)該將數(shù)據(jù)聲明為public
- 啞數(shù)據(jù)對象--除數(shù)據(jù)訪問函數(shù)外,沒有其它任何函數(shù)
- 程序當(dāng)中,復(fù)雜的條件邏輯是最常導(dǎo)致復(fù)雜度上升的地點之一
- ”分支邏輯“和”操作細(xì)節(jié)“分開
- 加入斷言,永遠(yuǎn)不會影響程序的行為。
- 不要濫用斷言
- 更多的時候,斷言的價值在于:幫助程序員理解代碼正確運行的必要條件
- 過長的參數(shù)列總是難以理解的
- 如果有必要,將參數(shù)的計算過程提煉到一個獨立函數(shù)中
- 應(yīng)該只在必要關(guān)頭才添加參數(shù),預(yù)先添加的參數(shù)很可能并不是你所需要的。
- 重復(fù)代碼是系統(tǒng)中最糟糕的東西之一
- 避免行為重復(fù),因為這容易導(dǎo)致 ”修改一個卻未能修改另一個“的風(fēng)險