《重构:改善既有代码的设计》阅读笔记
第一章 重構(gòu):第一個(gè)案例
重構(gòu)之前,首先檢查自己是否有一套可靠的測(cè)試機(jī)制。這些測(cè)試必須有自我檢驗(yàn)?zāi)芰Α?/p>
重構(gòu)技術(shù)就是以微小的步伐修改程序。如果你犯下錯(cuò)誤,很容易便可發(fā)現(xiàn)它。
任何一個(gè)傻瓜都能寫出計(jì)算機(jī)可以理解的代碼,唯有寫出人類容易理解的代碼,才是優(yōu)秀的程序員。
代碼應(yīng)該表現(xiàn)自己的目的,這一點(diǎn)非常重要。
重構(gòu)的節(jié)奏:測(cè)試、小修改、測(cè)試、小修改…正是這種節(jié)奏讓重構(gòu)得以快速而安全地前進(jìn)。
第二章 重構(gòu)原則
重構(gòu)(名詞):對(duì)軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本。
重構(gòu)(動(dòng)詞),使用一系列重構(gòu)首發(fā),在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu)。
添加新功能時(shí),你不應(yīng)該修改既有代碼,只管添加新功能。通過測(cè)試,你可以衡量自己的工作進(jìn)度。
重構(gòu)時(shí)你就不能再添加新功能,只管改進(jìn)程序結(jié)構(gòu)。此時(shí)你不應(yīng)該添加任何測(cè)試(除非發(fā)現(xiàn)先前遺漏的東西),只在絕對(duì)必要(用于處理接口變化)時(shí)才修改測(cè)試。
重構(gòu)本來就不是一件應(yīng)該特別撥出時(shí)間做的事情,重構(gòu)應(yīng)該隨時(shí)隨地進(jìn)行。你不應(yīng)該為重構(gòu)而重構(gòu),你之所以重構(gòu),是因?yàn)槟阆胱鰟e的什么事,而重構(gòu)可以幫助你把那些事做好。
添加功能時(shí)重構(gòu);修補(bǔ)錯(cuò)誤時(shí)重構(gòu);復(fù)審代碼時(shí)重構(gòu)
是什么讓程序難以修改?
- 難以閱讀的程序,難以修改
- 邏輯重復(fù)的程序,難以修改
- 添加新行為時(shí)需要修改已有代碼的程序,難以修改
- 帶復(fù)雜條件邏輯的程序,難以修改
何時(shí)不該重構(gòu)?
有時(shí)候你根本不應(yīng)該重構(gòu),例如當(dāng)你應(yīng)該重新編寫所有代碼的時(shí)候。有時(shí)候既有代碼寫的太混亂,重構(gòu)它還不如重新寫一個(gè)來得簡(jiǎn)單。重寫的一個(gè)清楚訊號(hào)就是:現(xiàn)有代碼根本不能正常運(yùn)作。而‘重構(gòu)’之前,代碼必須起碼在大部分情況下正常運(yùn)作。
重構(gòu)的確能夠提高生產(chǎn)力。如果你最后沒有足夠時(shí)間,通常就表示你其實(shí)早該進(jìn)行重構(gòu)。
重構(gòu)與設(shè)計(jì)
初學(xué)編程時(shí),渾渾噩噩地進(jìn)行開發(fā)。然而很快我便發(fā)現(xiàn),事先做好設(shè)計(jì)可以讓我節(jié)省返工的高昂成本
第三章 代碼的壞味道
- 重復(fù)代碼
- 過長(zhǎng)函數(shù)
- 過大的類
- 過長(zhǎng)參數(shù)列(有了對(duì)象,你就不必把函數(shù)需要的所有東西以參數(shù)傳遞給它了。太長(zhǎng)的參數(shù)列難以理解。)
- 發(fā)散式變化(我們希望一旦需要修改,就只在某一點(diǎn)處修改)
- 依戀情結(jié)(某個(gè)函數(shù)為了計(jì)算某個(gè)值,從另一個(gè)對(duì)象那兒調(diào)用了大部分函數(shù))
- 過度耦合的消息鏈
- 異曲同工的類(兩個(gè)函數(shù)做同一件事,卻有著不同的函數(shù)名)
- 過多的注釋(長(zhǎng)長(zhǎng)的注釋之所以存在是因?yàn)榇a很糟糕。當(dāng)代碼已經(jīng)清楚的說明一切時(shí),注釋就多余了。當(dāng)你感覺需要撰寫注釋時(shí),請(qǐng)先嘗試重構(gòu),試著讓所有注釋都變得多余。)
每當(dāng)感覺需要以注釋來說明點(diǎn)什么的時(shí)候,我們就把需要說明的東西寫進(jìn)一個(gè)獨(dú)立函數(shù)中,并以其用途(而非實(shí)現(xiàn)手法)命名。哪怕替換后的函數(shù)調(diào)用動(dòng)作比函數(shù)自身還長(zhǎng),只要函數(shù)名稱能夠解釋其用途,我們也該毫不猶豫地那么做。關(guān)鍵不在于函數(shù)的長(zhǎng)度,而在于函數(shù)“做什么”和“如何做”之間的語義距離。
條件表達(dá)式和循環(huán)常常也是提煉的信號(hào)。你應(yīng)該將循環(huán)和其內(nèi)的代碼提煉到一個(gè)獨(dú)立的函數(shù)中。
測(cè)試
編寫測(cè)試代碼時(shí),我往往一開始先讓他們失敗。之所以這么做,是為了向自己證明:測(cè)試機(jī)制的確可以運(yùn)行,并且的確測(cè)試了它該測(cè)試的東西。
總結(jié)
以上是生活随笔為你收集整理的《重构:改善既有代码的设计》阅读笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】SQLAlchemy长时
- 下一篇: 【EasyUI】DataGrid自定义排