重新組織數(shù)據(jù)
8.1 Self Encapsulate Field (自封裝字段)
- 為字段建立取值/設值函數(shù),并且只以這些函數(shù)來訪問字段
間接訪問變量的好處:
- 子類可以通過腹瀉一個函數(shù)二改變獲取數(shù)據(jù)的途徑
- 支持更靈活的數(shù)據(jù)管理方式疙驾,如延時初始化
這個重構(gòu)手法的適用范圍:
想訪問超類中的一個字段拆内,卻又想在子類中將對這個變量的訪問改為一個計算后的值
8.2 Replace Data Value With Object (以對象取代數(shù)據(jù)值)
當某個類中的數(shù)據(jù)項隨著功能擴展越來越多架谎,應該將一些數(shù)據(jù)和行為一起使用的數(shù)據(jù)項封裝起來
這種情況特別常見株汉,幾乎是隨著功能擴展出現(xiàn)的必然情況厨姚,隨之出現(xiàn)的就是重復代碼
和依戀情結(jié)
這兩個代碼壞味道。
8.3 Change Value to Reference(將對象改為引用)
這條重構(gòu)手法在于避免重復創(chuàng)建對象炊琉,對于意義完全相同的對象杰赛,應該使用同一個值。
手法:
使用工廠模式創(chuàng)建對象兽泄,使用集合對創(chuàng)建的對象進行緩存
最近在做的需求中漓概,使用ARouter獲取Service的功能,ARouter對Service的處理就是這種手法
但是引申出的問題就是想獲取兩個不同對象時反而比較麻煩病梢,個人感覺可以在獲取對象時添加是否使用緩存對象的選擇
8.4 Change Reference to Value(將引用對象改為值對象)
和8.3相反垛耳,當我們需要每次都獲取不同對象時,使用此手法
8.5 Replace Array with Object (以對象取代數(shù)據(jù))
此手法適用于一個數(shù)組中飘千,每條數(shù)據(jù)均代表不同含義的情況
新建一個類表示數(shù)據(jù)所擁有的信息,逐一為·數(shù)組元素添加取值/設值函數(shù)栈雳,根據(jù)元素的用途护奈,為這些函數(shù)命名。
此手法的意義在于將意義不明確的數(shù)組下標改為有意義的函數(shù)名
8.6 Duplicate Observed Data (復制 “被監(jiān)視對象”)
其實就是將Model層和View層隔離哥纫。書中使用觀察者模式對View進行更新霉旗。
目前Anroid似乎已經(jīng)有類似 DataBinding LiveData這種更現(xiàn)代的實現(xiàn)
8.7 Change Unidirectional Association to Bidirectional (將單向關聯(lián)改為雙向關聯(lián))
兩個類都需要使用對方特性,但其間只有一條單向連接。添加一個反向指針厌秒,并使修改函數(shù)能夠同時更新兩條鏈接读拆。
8.8 Change Bidirectional Association to Unidirectional (將單向關聯(lián)改為雙向關聯(lián))
兩個類之間有雙向關聯(lián),但其中一個類如今不在需要另一個類的特性鸵闪。
8.9 Replace Magic Number With Symbolic Constant(以字面常量取代魔法數(shù))
這個好理解檐晕,就是代碼里不要有魔法數(shù),不好理解
8.10 Encapsulate Field (封裝字段)
將public 改為private 提供函數(shù)對其訪問
8.11 Encapsulate Collection (封裝集合)
讓這個函數(shù)返回改集合的一個只讀副本蚌讼,并在這個類中提供添加辟灰,移除集合元素的函數(shù)
降低集合擁有者和用戶之間的耦合度
目前Gson源碼里使用的就是該手法
工程中sonar檢測也有該規(guī)則
8.12 Replace Record with Data Class (以數(shù)據(jù)類取代記錄)
創(chuàng)建一個類來記錄外來數(shù)據(jù),如數(shù)據(jù)庫記錄等
8.13 Replace Type Code with Class (以類取代類型碼)
類之中有一個數(shù)值類型碼篡石,但它并不影響類的行為
好處: 只要為這個類提供工廠函數(shù)芥喇,你就可以始終保證只有合法的實力才被創(chuàng)建出來塔橡,而且它們都會被傳遞給正確的宿主對象褐啡。
8.14 Replace Type Code with Subclassed(以子類取代類型碼)
類中有一個不可變的類型碼,但是會影響類的行為嫉柴,可以用子類的方式取代該類型碼胖眷,并將影響類行為的代碼移動到子類中
8.15 Replace Type Code with State/Strategy(以State/Strategy取代類型碼)
有一個類型碼武通,它會影響類的行為,但是無法通過繼承去消除它瘦材,可以使用策略模式或者狀態(tài)模式去重構(gòu)
8.16 Replace Subclass with Fields (以字段取代子類)
當某個類的各個子類的唯一差別只在“返回常量數(shù)據(jù)“的函數(shù)身上厅须,那么就不需要子類化。