《重構(gòu)》筆記
重構(gòu):提高軟件的可理解性,降低變更成本。
重構(gòu)自大到小,即使修改變量名也是一種重構(gòu)
重構(gòu)的原則:
1,重構(gòu)的目標(biāo):提高迭代效率
2,先重構(gòu),再開(kāi)發(fā)(比如:抽離老項(xiàng)目的通用模塊,交給新項(xiàng)目)
3,自動(dòng)化測(cè)試+持續(xù)集成+TDD驅(qū)動(dòng)重構(gòu)
重構(gòu)思想:事不過(guò)三,重復(fù)度體現(xiàn)出來(lái)的情況再進(jìn)行重構(gòu)(切勿過(guò)度設(shè)計(jì))
代碼的壞味道:
1,依賴傳遞(項(xiàng)目復(fù)雜時(shí),依賴會(huì)錯(cuò)綜復(fù)雜)
2,關(guān)注放大(修改某處代碼,需要瀏覽更多的代碼)
3,神秘命名(命名應(yīng)該準(zhǔn)確表達(dá)意義)
4,過(guò)度設(shè)計(jì)(過(guò)分考慮未來(lái)的需求)
5,艱難引用(結(jié)構(gòu)嵌套過(guò)多,訪問(wèn)過(guò)程過(guò)于復(fù)雜)
6,全局盲區(qū)(埋頭局部設(shè)計(jì),缺乏全局視角,定位不夠明確)
重構(gòu)的時(shí)機(jī):
1,code review? ? ? ?(給別人提意見(jiàn),幫助別人重構(gòu))
2,commint代碼? ? ? (提交前整理代碼,使之更干凈)
3,接手難讀的項(xiàng)目? ?(根據(jù)實(shí)際情況考量,決定是否說(shuō)服項(xiàng)目組重構(gòu))
4,迭代效率低于預(yù)期()
重構(gòu)的手段:
提煉變量:讓表達(dá)式可讀
提煉函數(shù):將意圖與實(shí)際分離
封裝類(lèi)型:高內(nèi)聚,低耦合
模塊化:邏輯劃分,代碼復(fù)用(抽象出模塊,類(lèi)庫(kù))
封裝階段:保持單一原則(保持可讀性)
委托模式:分離變化與不變的邏輯(封裝接口,依賴倒置)
服務(wù)化/多進(jìn)程:資源隔離? 共享資源
耦合個(gè)人理解:藕斷絲連,即使不使用的模塊,也會(huì)被牽連到,產(chǎn)生不必要的變動(dòng)與調(diào)用
(1)內(nèi)容耦合:一個(gè)模塊直接修改或操作另一個(gè)模塊的數(shù)據(jù),或一個(gè)模塊不通過(guò)正常入口而轉(zhuǎn)入另一個(gè)模塊。內(nèi)容耦合是最高程度的耦合,應(yīng)該避免使用之。
(2)公共耦合:兩個(gè)或兩個(gè)以上的模塊共同引用一個(gè)全局?jǐn)?shù)據(jù)項(xiàng)。在具有大量公共耦合的結(jié)構(gòu)中,確定究竟是哪個(gè)模塊給全局變量賦了一個(gè)特定的值是非常困難的。
(3)外部耦合:一組模塊都訪問(wèn)同一全局簡(jiǎn)單變量而不是同一全局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通過(guò)參數(shù)傳遞該全局變量的信息。
(4)控制耦合:一個(gè)模塊通過(guò)接口向另一模塊傳遞一個(gè)控制信號(hào),接受信號(hào)的模塊根據(jù)信號(hào)值而進(jìn)行適當(dāng)?shù)膭?dòng)作。
(5)標(biāo)記耦合:若一個(gè)模塊A通過(guò)接口向兩個(gè)模塊B和C傳遞一個(gè)公共參數(shù),則稱模塊B和C之間存在一個(gè)標(biāo)記耦合。
(6)數(shù)據(jù)耦合:模塊之間通過(guò)參數(shù)來(lái)傳遞數(shù)據(jù)。數(shù)據(jù)耦合是最低的一種耦合形式,系統(tǒng)中一般都存在這種類(lèi)型的耦合,因?yàn)闉榱送瓿梢恍┯幸饬x的功能,往往需要將某些模塊的輸出數(shù)據(jù)作為另一模塊的輸入數(shù)據(jù)。
(7)非直接耦合:兩個(gè)模塊之間沒(méi)有直接的關(guān)系,它們之間的聯(lián)系完全是通過(guò)主模塊的控制和調(diào)用來(lái)實(shí)現(xiàn)的。
如果模塊間必須存在耦合,就盡量使用數(shù)據(jù)耦合,少用控制耦合,限制公共耦合的范圍,盡量避免使用內(nèi)容耦合。