重构感悟随笔
1.添加功能時候重構(gòu),在添加新功能的時候發(fā)現(xiàn)原有代碼不能很好的添加新功能,而如果用某種設(shè)計可以很輕易的添加該功能,而且該代碼也能夠重構(gòu)成該設(shè)計那就重構(gòu)他吧。
2.修改bug的時候進行重構(gòu),當(dāng)你進行嚴格bug修改的時候,而代碼沒有一眼看出問題所在,需要反復(fù)查找才能找到,那你就應(yīng)該重構(gòu)他了。
3.當(dāng)需要給一段代碼添加注釋的時候,就應(yīng)該考慮是否需要把它提煉成一個單獨的函數(shù)了。
4.當(dāng)出現(xiàn)判斷或循環(huán)的時候也應(yīng)該考慮是否需要把它提煉成為一個函數(shù)了。
5.發(fā)散式變化(當(dāng)有變化時只對一進行修改,真對某一變化進行的應(yīng)該只針對一個類進行修改。而當(dāng)對多進行修改的時候說明應(yīng)該重構(gòu)了,找到那個引起所有修改的特定原因)。
6.一個類受到多種變化的影響,一個種變化引發(fā)了多個類的修改。
7.測試代碼,最好的編寫是在開始編寫功能之前,等于在問自己:添加各種功能到底要做什么,就可以把注意力集中到接口而非實現(xiàn),而當(dāng)測試通過也是工作結(jié)束的時候。
8.減少臨時變量的使用,把臨時變量替換成函數(shù)表達式或者可以改為查詢函數(shù),聲明為final可以檢測該值是否只被賦值一次。
9.解釋性變量,當(dāng)有一個復(fù)雜性的表達式的時候不易讀懂理解的時候,可以把其提煉出幾個final類類型的解釋性變量,一遍更好的閱讀。
10.一個臨時變量應(yīng)該只被賦值一次,只承擔(dān)一個職責(zé),當(dāng)一個變量被多次賦值的時候,用該把該變量進行拆分。
11.移除對參數(shù)的賦值,在方法中要防止對傳參的賦值,應(yīng)該添加一個臨時變量來進行對該參數(shù)的操作。
12.小型函數(shù)的優(yōu)美,而局部變量是將函數(shù)小型化的障礙。
13.以函數(shù)對象取代函數(shù),當(dāng)一個函數(shù)中臨時變量太多或該還是太難以重構(gòu)的時候可以把該函數(shù)轉(zhuǎn)換成函數(shù)對象。
14.替換算法,把不清晰明了的算法替換為更好的算法。
15.當(dāng)一個類的職責(zé)不在單一明確的時候,可以考慮重構(gòu)該類把該類分離出一個新的類。
16.委托關(guān)系,隱藏委托關(guān)系,本來是通過該對象的方法獲取一個新的對象,在通過該對象獲取想要的參數(shù),而隱藏委托就是直接在該對象提供一個調(diào)用參數(shù)的方法,所有方法都是在該方法中完成,隱藏了委托之間的關(guān)系。而有時候隱藏委托的中間人也是有弊端的,當(dāng)受托類每次添加一個新特性的時候,你就要給委托類添加一個簡單函數(shù),這是個痛苦的,所有這時候就該取消這個中間人了,應(yīng)該讓用戶自己直接調(diào)用受委托的對象。
17.通過函數(shù)取值賦值和直接通過對象獲取的區(qū)別,在子類繼承的時候會有所體現(xiàn),當(dāng)你想要對該值進行限制的時候,子類重寫就會更加方便而不用去改變父類。
18.以字面常量替換魔發(fā)數(shù)。
19.封裝字段或者說是隱藏數(shù)據(jù),類的字段應(yīng)該是private而不要是public并提供相應(yīng)的訪問函數(shù)方法。
20.對數(shù)組和集合的封裝,只給其函數(shù)方法,而不要把整個集合給它,這樣能保證集合數(shù)據(jù)結(jié)構(gòu)信息和當(dāng)該集合被修改的時候集合擁有者而對此一無所知。
21.啞數(shù)據(jù)對象,用于記錄數(shù)據(jù)而沒有具體的行為對象。
22.以類取代類型代碼,通過創(chuàng)建一個類,設(shè)定幾個常量為類型代碼,該常量的類型為該類本身,在設(shè)置一個狀態(tài)變量用來存儲類型代碼的具體數(shù)據(jù),通過構(gòu)造方法給予該變量賦值,而幾個常量會在該類創(chuàng)建的時候就確定所有的類型代碼。
23.以子類取代類型嗎,通過以不同的類型繼承于主體類,然后通過工廠方法傳參來判定應(yīng)該創(chuàng)建的子類。
24.以狀態(tài)設(shè)計模式取代類型碼,通過創(chuàng)建一個狀態(tài)父類,在分別繼承幾個不同狀態(tài)的子類,在需要的類中增加一個函數(shù)工廠方法,通過函數(shù)工廠方法接受的參來生成繼承的不同狀態(tài)對象,并將該狀態(tài)存入變量中。
25.以字段取代子類,當(dāng)幾個子類之間的差別只是函數(shù)返回的常量數(shù)據(jù)不同的時候,可以去除子類,只有加上對應(yīng)的常量即可,通過工廠方法的不同賦予其構(gòu)造方法的參數(shù)不同實現(xiàn)不同的對象。
26.分解條件表達式,把if,then,else分別分解成為一個函數(shù)。
27.將一系列判斷但最終行為卻一致的合成為一個表達式,而合成為一個表達式后可以把它進一步重構(gòu)為一個函數(shù)。整合為一個函數(shù)表達的意思不同了,一個是做了什么,而整合之后是為什么這么做。
28.以衛(wèi)語句代替復(fù)雜的嵌套表達式,if判斷的時候可以使用多個單個if進行判斷,也可以把復(fù)雜的if判斷,將其中的條件進行條件翻轉(zhuǎn),后在進行以衛(wèi)語句進行重構(gòu)。
29.以null對象取代null值,在改對象下新建一個子類,兩個類都實現(xiàn)isNull的方法,一個返回true,一個返回false。在在父類創(chuàng)建一個函數(shù),該函數(shù)的作用是返回一個子類的類型對象(也就是一個null對象),子類和父類的區(qū)別主要在于用到isNull判斷時候分別執(zhí)行的不同的方法,子類重寫該方法返回當(dāng)為null的時候該執(zhí)行的方法。
30.修改方法和查詢方法分開,不要混為一譚漿糊。
31.權(quán)限封裝,隱藏,顯示,隱藏能隱藏的一切,顯示必要的。函數(shù),變量,委托關(guān)系。
32.個函數(shù)一個好名字,如果不知道名字怎么命名可以先寫一段注釋,然后簡化注釋。好辦法。
33.當(dāng)幾個函數(shù)做著相同的事但就只有一部分不一樣,我沒法重構(gòu)整個函數(shù)但我可以重構(gòu)其中的一部分,可以找出相同的,把不同的能當(dāng)做參數(shù)來傳遞只重構(gòu)這一部分,為這一部分重新創(chuàng)建一個新的函數(shù)。
34.當(dāng)不知道怎么重構(gòu)的時候可以一小步一小步的來,先運用最簡單的重構(gòu)方法,當(dāng)重構(gòu)一次了的時候下一次重構(gòu)的思路可能已經(jīng)展現(xiàn)在你面前了。
35.引入?yún)?shù)對象,當(dāng)你頻繁的使用幾個參數(shù)當(dāng)做參傳給函數(shù)的時候,就可以考慮把這幾個參(數(shù)據(jù)泥團)封裝成為一個對象,并可以把這個幾個字段設(shè)為不可變的,只能通過構(gòu)造方法來進行賦值,等于是只能在創(chuàng)建的時候進行賦值,這就是不可變的類了。
36.移除設(shè)置函數(shù),當(dāng)一個類有一個或幾個字段在改類創(chuàng)建以后的就不在需要改變的時候,去除這幾個設(shè)值函數(shù),在構(gòu)造方法中給予他賦值,并把它設(shè)為fianl,以保證以后的程序員不會亂用你的設(shè)值函數(shù),已造成其他麻煩。
37.封裝向下轉(zhuǎn)型,把轉(zhuǎn)型動作封裝到函數(shù)中,而不是向下轉(zhuǎn)型的操作交給客戶端。
38.字段上移,當(dāng)幾個子類中有相似的字段的時候,看看他們所調(diào)用到的函數(shù)是否相同相似,若是則可以將其字段上移到超類中。
39.重復(fù)容易滋生錯誤,函數(shù)上移跟字段上移相似,還有構(gòu)造函數(shù)上移,通過在父類中建立新的函數(shù)而通過子類的構(gòu)造函數(shù)調(diào)用父類的構(gòu)造函數(shù)。
40.字段或函數(shù)下移(有點不明白)該何時用,動機是什么,把父類中只有一部分被實現(xiàn)的沒有被全部子類實現(xiàn)的可以抽取出來新創(chuàng)建一個子類。
41.接口和超類的提煉,超類和子類沒有太大區(qū)別,將他們合并。
42.好幾個類,以相同的順序執(zhí)行不同的操作,可以運用到模板設(shè)計,把順序提出成為一個函數(shù),并提升到超類中。而內(nèi)部的操作根據(jù)不同的地方分解為一個個函數(shù)在超類中定義為一個個抽象方法,而不同的子類分別實現(xiàn)不同的函數(shù)就可以通過,多態(tài)的不同進而實現(xiàn)調(diào)用不同的方法。
43.以委托取代繼承,當(dāng)你繼承了一個父類的時候,發(fā)現(xiàn)自己只需要其中的一部分功能的時候,這時候可以用委托來取代繼承。
44.重構(gòu)小步小步前進,確保每一次重構(gòu)后測試正確,確保能隨時停止重構(gòu),確保能隨時撤銷重構(gòu)。重構(gòu)的時候只是重構(gòu),就算發(fā)現(xiàn)代碼有缺陷有要修改的地方也要忍著,記下來,完成重構(gòu),在換回另一種編寫代碼的職責(zé),兩種職責(zé)要分開,確保職責(zé)的單一。
轉(zhuǎn)載于:https://www.cnblogs.com/bowei/p/8649159.html
總結(jié)
- 上一篇: (转)Android QQ空间(Apad
- 下一篇: 转 《图说区块链》读书笔记(完整版)