重構(gòu)

1.重復(fù)代碼 ==》同一個(gè)類的兩個(gè)函數(shù)含有相同的代碼(Extract Method)
===========》兩個(gè)互為兄弟的子類含有相同的表達(dá)式。(對(duì)兩個(gè)類都使用Extract Method,Pull Up Method再將它推入超類內(nèi))
如果代碼之間只是類似,并非完全相同,那么就得運(yùn)用Extract Method將相似部分和差異部分分割開,構(gòu)成單獨(dú)一個(gè)函數(shù)。
============》如果是兩個(gè)毫不相關(guān)的類出現(xiàn)重復(fù)代碼,考慮對(duì)其中一個(gè)使用Extract Class ,將重復(fù)代碼提煉到一個(gè)獨(dú)立類中,然后在另外一個(gè)
類內(nèi)使用這個(gè)新類。
2.過(guò)長(zhǎng)函數(shù)====》百分之九十九的場(chǎng)合里,要把函數(shù)變小,只需使用Extract Method,找到函數(shù)中適合集中在一起的部分,將他們提煉出來(lái)形成一個(gè)新函數(shù)。
=====》對(duì)于函數(shù)內(nèi)有大量的參數(shù)和臨時(shí)變量,直接嘗試Extract Method 會(huì)把許多參數(shù)和臨時(shí)變量當(dāng)作參數(shù),傳遞給被提煉出來(lái)的新函數(shù),導(dǎo)致
可讀性沒(méi)有提升??梢杂肦eplace Temp with Query.Introduce Parameter Object 和 Preserve Whole Oject。最后還有Replace Method with Method Object.
=======>條件表達(dá)式和循環(huán)常常也是提煉的信號(hào),運(yùn)用Decompose Conditional 處理?xiàng)l件表達(dá)式。
========》循環(huán)體,將循環(huán)和其內(nèi)的代碼提煉到一個(gè)獨(dú)立函數(shù)中。

3.Large Class過(guò)大的類===》利用單獨(dú)的類做太多事情,會(huì)出現(xiàn)太多實(shí)例變量,一旦如此,重復(fù)代碼也就接踵而至。運(yùn)用Extract Class將幾個(gè)變量一起提煉至新類中,提煉應(yīng)該選擇
類內(nèi)彼此相關(guān)的變量,將它們放在一起。

  1. Long Parameter List過(guò)長(zhǎng)參數(shù)列表====》如果向已有的對(duì)象發(fā)出一條請(qǐng)求就可以取代一個(gè)參數(shù),那么你應(yīng)該激活重構(gòu)手法Replace parameter with Method。
    ====》運(yùn)用Preserve Whole Object 將來(lái)自同一對(duì)象的一堆數(shù)據(jù)收集起來(lái),并以該對(duì)象替換它們。
    ===》如果某些數(shù)據(jù)缺乏合理的對(duì)象歸屬,可使用Introduce parameter Object為它們制造出一個(gè)參數(shù)對(duì)象。
    5.發(fā)散式變化:(在同一個(gè)類中修改多處)我們希望軟件能夠更容易被修改,修改的話只在該處修改,做不到,就有問(wèn)題。因此找出某特定原因造成的所有變化,然后運(yùn)用Extract Class將它們提煉到另一個(gè)類中。

6.Shotgun Surgery(霰彈式修改)===》遇到某種變化,在不同類做許多小修改。運(yùn)用Move Method和Move Field,把需要修改的代碼放進(jìn)同一個(gè)類。如果沒(méi)有合適的地方就創(chuàng)造一個(gè)??蛇\(yùn)用Inline Class把一系列相關(guān)
相關(guān)行為放進(jìn)同一個(gè)類。

7.Feature Envy依戀情結(jié)=====》函數(shù)對(duì)某個(gè)類的興趣高過(guò)對(duì)自己所處類的興趣,用Move Method將它移到它該去的地方。

8.Data Clumps 數(shù)據(jù)泥團(tuán)===》常??吹胶芏嗟胤较嗤娜捻?xiàng)數(shù)據(jù):兩個(gè)類中相同的字段,許多函數(shù)簽名中相同的參數(shù)。這些綁定在一起的數(shù)據(jù)真應(yīng)該擁有
屬于他們自己的對(duì)象。運(yùn)用Extract Class將它們提煉到一個(gè)獨(dú)立對(duì)象中。然后將注意力轉(zhuǎn)移到函數(shù)簽名上,運(yùn)用Introduce Parameter Object 或Preserve Whole Object為它減肥。

  1. Primitive Obsession 基本類型偏執(zhí)
    10 Switch Statements(Switch 驚悚現(xiàn)身) ====》用Extract Method將switch語(yǔ)句提煉到一個(gè)獨(dú)立函數(shù)中,再用Move Methdo搬移到多態(tài)性的那個(gè)類中。

具體:

  1. Inline Temp (內(nèi)聯(lián)臨時(shí)變量)====》你有一個(gè)臨時(shí)變量,只被一個(gè)簡(jiǎn)單表達(dá)式賦值一次,而它妨礙了其他重構(gòu)手法,將所有對(duì)該變量的引用動(dòng)作,替換為對(duì)它賦值的那個(gè)表達(dá)式自身。

  2. Replace Temp with Query (以查詢?nèi)〈R時(shí)變量)====》你的程序以一個(gè)臨時(shí)變量保存某一表達(dá)式的運(yùn)算結(jié)果。將這個(gè)表達(dá)式替換為對(duì)新函數(shù)的調(diào)用。此后新函數(shù)就可以被其他函數(shù)使用。

  3. Split Temporary Variable 分解臨時(shí)變量======》你的程序在某個(gè)臨時(shí)變量被賦值超過(guò)一次,它既不是循環(huán)變量,也不被用于收集計(jì)算結(jié)果。針對(duì)每次賦值,創(chuàng)造一個(gè)獨(dú)立、對(duì)應(yīng)的臨時(shí)變量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容