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