這本書買了很久了,最近才讀完,做個(gè)簡(jiǎn)單的記錄,方便以后復(fù)習(xí)。
重構(gòu)的目的:改善代碼的可讀性和可維護(hù)性
重構(gòu)帶來的影響:軟件的功能不便,可閱讀性,可維護(hù)性增強(qiáng),性能得到優(yōu)化
重構(gòu)的指導(dǎo)原則:重構(gòu)的各種發(fā)放應(yīng)該遵循基本的軟件設(shè)計(jì)原則
重構(gòu)的時(shí)機(jī):一般在項(xiàng)目實(shí)踐中,專門安排時(shí)間重構(gòu)是不太可能的,因?yàn)槔习逯魂P(guān)心功能和進(jìn)度,至于軟件的內(nèi)部結(jié)構(gòu)根本不在考慮范圍之內(nèi)。因此重構(gòu)的時(shí)機(jī)很重要,一般重構(gòu)可以在以下幾種情況下進(jìn)行:
1、舔加新功能時(shí)
2、修改bug時(shí)
3、代碼評(píng)審時(shí)重構(gòu)的意義:重構(gòu)對(duì)于軟件本身的意義很明顯,如改善代碼結(jié)構(gòu),增加可讀性,可擴(kuò)展性,提升性能,這里就不再贅述了。說一說重構(gòu)對(duì)于程序員本身的意義。
1、提升設(shè)計(jì)思維:由于重構(gòu)本身是基于基本的設(shè)計(jì)原則,因此程序員開始審視重構(gòu)代碼的時(shí)候,其實(shí)是用各種設(shè)計(jì)原則去評(píng)審代碼是否合理,在潛意識(shí)中強(qiáng)化了編碼者設(shè)計(jì)思維的習(xí)慣。
2、提升技術(shù)自信心:大家知道重構(gòu)其實(shí)是對(duì)自己或者他人既有的代碼的修改,當(dāng)你以一種更優(yōu)雅的結(jié)構(gòu)去替換原本丑陋的結(jié)構(gòu)的時(shí)候,內(nèi)心自然會(huì)有一種自豪感,由此提升自身對(duì)技術(shù)的自信。對(duì)技術(shù)的自信,是提升學(xué)習(xí)興趣的不二法門。即:越優(yōu)秀,越想優(yōu)秀
3、修煉心性:很多時(shí)候,重構(gòu)并不是一蹴而就的,由于既有的代碼謎團(tuán)可能導(dǎo)致重構(gòu)之前需要大量的思考。思考過后修改了代碼還需要謹(jǐn)慎的測(cè)試。這都需要耗費(fèi)大量的心力。最為關(guān)鍵的時(shí),重構(gòu)通常并不在項(xiàng)目計(jì)劃內(nèi)(沒有哪個(gè)老板愿意花時(shí)間在看不到的影響上),因此程序員需要合理安排重構(gòu)時(shí)間。最大的問題是還需承擔(dān)修改原有代碼帶來的改變?cè)蟹€(wěn)定功能的風(fēng)險(xiǎn)。(這應(yīng)該才是大家回避重構(gòu)的最大原因)
下面說說重構(gòu)的具體實(shí)踐,我們都知道,重構(gòu)是對(duì)既有代碼的改善,那么,什么樣的既有代碼需要改善呢?這里就引出了代碼壞味道的概念:
書中闡述了一系列壞味道,挑一批簡(jiǎn)單的說一下:
1、重復(fù)代碼:
- 概述:重復(fù)代碼一般表示類中不同方法都含有相同的邏輯,或者各個(gè)類中含有相同的邏輯
- 不良影響:代碼重用性低,不便于維護(hù),修改邏輯時(shí),所有地方都要修改,導(dǎo)致遺漏
-
重構(gòu)手法:一般就是抽出方法,如果是同一類,就抽出一般方法放在類的內(nèi)部。如果是重復(fù)代碼分散在多個(gè)類,就需要抽出公共方法,或者是抽出一個(gè)單獨(dú)的類來處理
2、過長(zhǎng)函數(shù): - 概述:函數(shù)太長(zhǎng),其中代碼結(jié)構(gòu)和邏輯都混亂,尤其是N多邏輯判斷結(jié)構(gòu),if-else,for循環(huán)和異常處理之間反復(fù)糾纏,一團(tuán)亂麻。
- 不良影響:首當(dāng)其沖的就是可讀性,這其實(shí)是時(shí)間成本,5秒鐘能讀懂一個(gè)函數(shù)和5分鐘讀懂肯定不是一回事,而且大家都知道,每個(gè)人能保持專注力的時(shí)間是有限的,如果一個(gè)高度復(fù)雜的函數(shù),完全可能耗費(fèi)你大量的專注力,最后由于精力耗盡還不得不重新來過,這個(gè)在實(shí)踐中是經(jīng)常出現(xiàn)的。
-
重構(gòu)手法:首先需要遵循單一職責(zé)的原則,看一看方法是否擔(dān)任了過多的職責(zé),這往往是導(dǎo)致方法過長(zhǎng)的主要原因,如果是,需要拆分為多個(gè)方法。
抽出方法把功能模塊分析,用查詢替換臨時(shí)元素消除過多臨時(shí)變量,引入?yún)?shù)對(duì)象消除過長(zhǎng)的參數(shù)列表
3、過大類: - 概述:一個(gè)類如果承擔(dān)過多的職責(zé),必然導(dǎo)致類過大
- 不良影響:可讀性差,違反單一職責(zé)原則,破壞封裝性,類間強(qiáng)耦合,擴(kuò)展性可維護(hù)性都很差
-
重構(gòu)手法:理清邏輯,劃分功能,將不同的功能單獨(dú)抽出成不同的類。根據(jù)需要或許還應(yīng)該抽出子類。
4、過長(zhǎng)參數(shù)列表: - 概述:參數(shù)列表一長(zhǎng)串,各種類型的,參數(shù)命名可讀性差
- 不良影響:人能記住的數(shù)據(jù)點(diǎn)是有限的,一長(zhǎng)串參數(shù)在方法體內(nèi)頻繁出現(xiàn),勢(shì)必導(dǎo)致閱讀時(shí)需要反復(fù)回顧參數(shù)意義,可讀性降低,而且容易出錯(cuò),特別是某些參數(shù)還要被作為其它方法的參數(shù)被代入到其它方法體內(nèi)的時(shí)候。有時(shí)候需要往回翻好幾層才能回顧參數(shù)的具體意義。增加閱讀難度
-
重構(gòu)手法:用參數(shù)對(duì)象取代單純的參數(shù),參數(shù)對(duì)象對(duì)于方法來說只有一個(gè)元素,需要記憶的量為1,而且對(duì)象可以歸類分散的參數(shù),使其具有更明確的意義。
5、發(fā)散式變化: - 概述:一個(gè)人在公司太重要了,管理要做,技術(shù)要做,財(cái)務(wù)也要做,還得做業(yè)務(wù)。有點(diǎn)什么事都要找到他,哪天他身體抱恙出了點(diǎn)問題,公司癱瘓了。類也是如此,一個(gè)類負(fù)責(zé)了太多的功能,導(dǎo)致系統(tǒng)有什么變化都會(huì)引起該類的修改。
- 不良影響:職責(zé)不單一,不符合開閉原則,老是改來改去,容易出問題
-
重構(gòu)手法:劃分功能,抽出類。注意此處是多處業(yè)務(wù)對(duì)應(yīng)一個(gè)類,下面的霰彈式修改是修改一個(gè)業(yè)務(wù),卻要改N個(gè)類
6、霰彈式修改: - 概述:業(yè)務(wù)變一點(diǎn),要改N個(gè)地方,還經(jīng)常改漏
- 不良影響:業(yè)務(wù)變更導(dǎo)致多處修改,代碼重用性低,漏改風(fēng)險(xiǎn)大
-
重構(gòu)手法:如果是代碼塊重復(fù)就應(yīng)該抽出方法,如果是方法分散就應(yīng)該move method把相關(guān)的功能移到一個(gè)類中
7、依戀情節(jié): - 概述:函數(shù)需要的數(shù)據(jù)大多來自其它類
- 不良影響:造成類與類之間的耦合
-
重構(gòu)手法:把方法移到其所需要的數(shù)據(jù)所在的內(nèi),這樣方法可以直接訪問數(shù)據(jù),類與類之間也解耦了
8、基本類型偏執(zhí): - 概述:喜歡使用基本數(shù)據(jù)類型
- 不良影響:不符合面向?qū)ο笤瓌t
-
重構(gòu)手法:使用對(duì)象代替基本類型
9、Switch Statement: - 概述:用switch語句判斷
- 不良影響:增加代碼復(fù)雜度,而且需要頻繁修改類,不符合開閉原則
-
重構(gòu)手法:用多態(tài)代替
10、臨時(shí)字段: - 概述:代碼中大量的臨時(shí)變量,并且命名也不清晰,不知道變量要表達(dá)什么意思
- 不良影響:增加閱讀難度
-
重構(gòu)手法:
11、中間人: - 概述:過度使用委托
- 不良影響:過度使用委托,增加代碼層次,復(fù)雜度
-
重構(gòu)手法:移除中間人
12、過度耦合的消息鏈: - 概述:過度的使用代理導(dǎo)致大量的中間人
- 不良影響:牽一發(fā)而動(dòng)全身,某個(gè)修改可能導(dǎo)致一個(gè)鏈的修改。風(fēng)險(xiǎn)增大
-
重構(gòu)手法:
13、過多的注釋: - 概述:注釋過多,有的是歷史遺留的,有的還是錯(cuò)誤的注釋
- 不良影響:注釋過多實(shí)際上影響代碼的可讀性,因?yàn)榇a中穿插注釋,容易引起閱讀人注意力分散。并且過多的注釋往往使代碼看起來凌亂不堪,有的錯(cuò)誤的注釋反而會(huì)讓人迷惑。對(duì)編碼者來說,以為有注釋可以依賴,就不會(huì)注重代碼本身的可讀性。
- 重構(gòu)手法:盡量用規(guī)范,有意義的命名方法命名類,方法,字段
總結(jié):重構(gòu)是一個(gè)循序漸進(jìn)的過程,很少有代碼重構(gòu)是一步就緒的。要做好重構(gòu),需要掌握以下技能點(diǎn):
1、熟悉基本設(shè)計(jì)原則和軟件設(shè)計(jì)模式,多看優(yōu)秀的代碼,從審美上提升自己,只有這樣,才會(huì)有發(fā)現(xiàn)代碼壞味道的能力
2、熟悉常用的重構(gòu)手法,時(shí)不時(shí)翻翻本書.
3、養(yǎng)成重構(gòu)的習(xí)慣,哪怕項(xiàng)目中不允許,也可以用項(xiàng)目代碼做重構(gòu)練習(xí)(不提交)
4、英文要學(xué)好,對(duì)方法和變量的 命名很有幫助,只有這樣才能給出命名清晰的變量