重構(gòu)

什么是重構(gòu)
重構(gòu):使用一系列重構(gòu)手法,在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu)。用戶的體驗不應(yīng)該有任何改變。如果我在重構(gòu)過程中發(fā)現(xiàn)了任何bug,重構(gòu)完成后同樣的 bug 應(yīng)該仍然存在。
重構(gòu)的關(guān)鍵在于運用大量微小且不改變軟件表現(xiàn)的步驟,一步步達成大規(guī)模的修改。每個單獨的重構(gòu)很小。
重構(gòu)的目的:提高軟件質(zhì)量
改進軟件設(shè)計:代碼不做重構(gòu),會因為每次的小改動導(dǎo)致混亂。類似于房間整理。其中之一就是減少重復(fù)代碼;
使代碼容易理解:讓其他開發(fā)者能夠讀懂,他人能夠讀懂你的代碼,就很容易去修改,提高開發(fā)效率。減少讀代碼時考古時間;
幫助找到 bug;
保持代碼的清晰和有序,避免代碼腐敗;
什么時候重構(gòu)
Kent Beck 提出了“兩頂帽子”的比喻。我們平常開發(fā)時包括兩個活動:添加新功能、重構(gòu)。兩頂帽子交替進行,一會開發(fā)新代碼,一會進行重構(gòu)。添加新功能時如果發(fā)現(xiàn)一段代碼可以更好,那就更換帽子,進行重構(gòu)工作,完成后再繼續(xù)添加新功能。
以下是幾個常見的需要重構(gòu)的情況:
代碼重復(fù):如果你發(fā)現(xiàn)有大量的相似或完全相同的代碼,那么重構(gòu)就是必須的,你可以通過抽象方法或類來減少重復(fù)。
難以理解的代碼:如果代碼難以閱讀或理解,那么它需要重構(gòu),使得代碼更易于理解,可以提高團隊的生產(chǎn)力。
新增功能:在給現(xiàn)有代碼添加新功能前,往往需要對其進行重構(gòu),以保持代碼結(jié)構(gòu)的整潔。
性能優(yōu)化:如果代碼的性能不佳,那么通過重構(gòu)可能能找到優(yōu)化的機會。
什么時候不重構(gòu)
一塊代碼可以正常工作,不需要修改那就不重構(gòu);一個功能隱藏在一個 api 下,那就可以不重構(gòu);
如果重寫比重構(gòu)容易,那就重寫;
緊迫的截止日期:在緊迫的截止日期面前,如果重構(gòu)可能導(dǎo)致項目延期,那么你可能需要權(quán)衡是否真的需要重構(gòu);
缺乏測試:如果代碼缺乏足夠的測試,重構(gòu)可能會引入新的錯誤,因此在重構(gòu)之前,你需要確保有足夠的測試用例。
怎么重構(gòu)
瀏覽代碼;
對照代碼壞味道清單,檢查是否符合;
如果出現(xiàn)則選擇相應(yīng)的重構(gòu)方法重構(gòu),要注意的是,重構(gòu)方法只是某種情景下的一種修改代碼的方法,而不意味著這樣重構(gòu)在任何情況下的必然正確性。
代碼壞味道清單
神秘命名
重復(fù)代碼
過長函數(shù)
過長參數(shù)列表
數(shù)據(jù)泥團
循環(huán)語句 Loops
重復(fù)的 switch
if else 多層嵌套
全局數(shù)據(jù)
可變數(shù)據(jù)
