在對(duì)象之間搬移特性
1. Move Method(搬移函數(shù))
Q:你的程序中,有個(gè)函數(shù)與其所駐類之外的另一個(gè)類進(jìn)行更多交流:調(diào)用后者,或被后者調(diào)用
A:在該函數(shù)最常引用的類中建立一個(gè)有著類似行為的新函數(shù),將舊函數(shù)變成一個(gè)單純的委托函數(shù),或是將舊函數(shù)完全移除。
2. Move Field(搬移字段)
Q:在你的程序中,某個(gè)字段被其所駐類之外的另一個(gè)類更多地用到间景。
A:在目標(biāo)類新建一個(gè)字段,修改源字段的所有用戶艺智,令它們改用新字段倘要。
搬移字段前應(yīng)該先進(jìn)行 getter 和 setter 函數(shù)的封裝。
3. Extract Class(提煉類)
Q:某個(gè)類做了應(yīng)該由兩個(gè)類做的事。
A:建立一個(gè)新類封拧,將相關(guān)的字段和函數(shù)從舊類搬移到新類志鹃。
類的體積過于龐大,改動(dòng)類的部分字段時(shí)對(duì)其他字段毫無影響泽西,子類化時(shí)發(fā)現(xiàn)一些特性與另一些特性的子類化方式不相同曹铃,此時(shí)應(yīng)該考慮提煉類。
4. Inline Class(將類內(nèi)聯(lián)化)
Q:某個(gè)類沒有做太多事情捧杉。
A:將這個(gè)類的所有特性搬移到另一個(gè)類中陕见,然后移除原類。
與 Extract Class 相反味抖,當(dāng)一個(gè)類不再承擔(dān)足夠責(zé)任或不再有單獨(dú)存在的理由時(shí)评甜,挑選一個(gè)頻繁使用這個(gè)類的用戶類進(jìn)行內(nèi)聯(lián)化。
5. Hide Delegate(隱藏“委托關(guān)系”)
Q:客戶通過一個(gè)委托類來調(diào)用另一個(gè)對(duì)象仔涩。
A:在服務(wù)類上建立客戶所需的所有函數(shù)忍坷,用以隱藏委托關(guān)系。
“封裝”意味著每個(gè)對(duì)象都應(yīng)該盡可能少了解系統(tǒng)的其他部分熔脂。
6. Remove Middle Man(移除中間人)
Q:某個(gè)類做了過多的簡單委托動(dòng)作佩研。
A:讓客戶直接調(diào)用受托類。
與上一條相反霞揉,對(duì)于過度委托的中間類旬薯,每當(dāng)客戶想使用受托類的新特性,都必須在服務(wù)委托類上加入新的函數(shù)零聚,此時(shí)應(yīng)該直接讓客戶訪問受托類。
7. Introduce Foreign Method(引入外加函數(shù))
Q:你需要為提供服務(wù)的類增加一個(gè)函數(shù)些侍,但你無法修改這個(gè)類隶症。
A:在客戶類中建立一個(gè)函數(shù),并以第一參數(shù)形式傳入一個(gè)服務(wù)類實(shí)例岗宣。
外加函數(shù)用于解決 SDK 中無法修改的類蚂会,增加更多功能,但是也會(huì)導(dǎo)致函數(shù)零散分布耗式,耦合嚴(yán)重胁住。
8. Introduce Local Extension(引入本地?cái)U(kuò)展)
Q:你需要為服務(wù)類提供一些額外函數(shù),但你無法修改這個(gè)類刊咳。
A:建立一個(gè)新類彪见,使它包含這些額外函數(shù)。讓這個(gè)擴(kuò)展品成為源類的子類或包裝類娱挨。