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)有提升悦污。可以用Replace 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)的變量懦冰,將它們放在一起谣沸。
- 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為它減肥。
- Primitive Obsession 基本類型偏執(zhí)
10 Switch Statements(Switch 驚悚現(xiàn)身) ====》用Extract Method將switch語(yǔ)句提煉到一個(gè)獨(dú)立函數(shù)中奠滑,再用Move Methdo搬移到多態(tài)性的那個(gè)類中。
具體:
Inline Temp (內(nèi)聯(lián)臨時(shí)變量)====》你有一個(gè)臨時(shí)變量摊崭,只被一個(gè)簡(jiǎn)單表達(dá)式賦值一次杰赛,而它妨礙了其他重構(gòu)手法,將所有對(duì)該變量的引用動(dòng)作根时,替換為對(duì)它賦值的那個(gè)表達(dá)式自身辰晕。
Replace Temp with Query (以查詢?nèi)〈R時(shí)變量)====》你的程序以一個(gè)臨時(shí)變量保存某一表達(dá)式的運(yùn)算結(jié)果。將這個(gè)表達(dá)式替換為對(duì)新函數(shù)的調(diào)用替裆。此后新函數(shù)就可以被其他函數(shù)使用窘问。
Split Temporary Variable 分解臨時(shí)變量======》你的程序在某個(gè)臨時(shí)變量被賦值超過(guò)一次,它既不是循環(huán)變量胸遇,也不被用于收集計(jì)算結(jié)果汉形。針對(duì)每次賦值,創(chuàng)造一個(gè)獨(dú)立概疆、對(duì)應(yīng)的臨時(shí)變量。