翻譯|使用教程|編輯:鮑佳佳|2021-04-19 10:50:38.227|閱讀 144 次
概述:如您所知,IntelliJ IDEA提供的兩種最流行的基本重構(gòu):Extract Method和Inline Method。 第一種方法使方法更短且更具可讀性,而第二種方法使不必要的方法的數(shù)量減至最少,并使代碼更直接。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
如您所知,IntelliJ IDEA提供的兩種最流行的基本重構(gòu):Extract Method和Inline Method。
第一種方法使方法更短且更具可讀性,而第二種方法使不必要的方法的數(shù)量減至最少,并使代碼更直接。
在IntelliJ IDEA中,您可以連續(xù)使用這兩種操作來獲得更復(fù)雜的結(jié)果-我們將此過程稱為多步驟重構(gòu)。
讓我們來看看,看看我們可以做些什么,用更少的成本實現(xiàn)更多。
問題
假設(shè)我們有一個只檢查一個條件的方法:
void repair(Vehicle vehicle) {
if (vehicle instanceof Car) {
System.out.println("Repairing: " + vehicle);
} else {
System.out.println("Cannot repair this: " + vehicle);
}
}
僅當(dāng)將Car對象傳遞給repair method()時,才會執(zhí)行“ Repairing:”分支。
在其他情況下,將執(zhí)行另一個分支。
因此,例如,如果我們有一個Trucktype對象,我們將看到來自else分支的輸出。
這可能不完全是我們想要的結(jié)果。 現(xiàn)有的檢查非常粗糙,僅允許我們用方法修理汽車。
如果我們還想修理其他車輛(例如卡車),而該輪胎只有一個小問題(例如輪胎漏氣),該怎么辦?
假設(shè)我們已經(jīng)有一種檢查這種情況的方法:
private boolean checkClient(Vehicle vehicle)
{
return (vehicle instanceof Car || vehicle.failureCondition == Vehicle.FailureCondition.FLAT_TIRE);
}
我們將如何與調(diào)用該方法來取代我們現(xiàn)有的檢查?
解決方案
通過“提取方法”重構(gòu),我們將把Car的車輛實例提取為“臨時方法”。 我們將Car的方法body return vehicle instance更改為return checkClient(vehicle),然后內(nèi)聯(lián)我們的方法以更改代碼并產(chǎn)生以下結(jié)果,這將解決Truck對象的問題:
void repair(Vehicle vehicle) {
if (checkClient(vehicle)) {
System.out.println("Repairing: " + vehicle);
} else
{
System.out.println("Cannot repair this: " + vehicle);
}
}
讓我們逐步看一下重構(gòu)過程:
我們選擇我們的表達(dá)式車輛實例Car,按macOs的??M或Windows的Ctrl+Alt+M。
請注意,如果在代碼中發(fā)現(xiàn)重復(fù)項,則IntelliJ IDEA還會在“提取方法”對話框中顯示通知。
重構(gòu)之后,我們將獲得“臨時”方法:
private boolean isaBoolean(Vehicle vehicle) { return vehicle instanceof Car; }
現(xiàn)在,我們將主體返回車輛instanceof的方法更改Car為return checkClient(vehicle)。
讓我們選擇提取方法的名稱, 對于macOsisaBoolean按??N,對于Windows按Ctrl + Alt + N。
請注意,在“內(nèi)聯(lián)方法”對話框中選擇了“全部內(nèi)聯(lián)并刪除方法”選項。 IntelliJ IDEA刪除了我們的“臨時”方法,并將條件更改為我們的原始方法:
class CarMechanic {
void repair(Vehicle vehicle) {
if (checkClient(vehicle)) {
System.out.println("Repairing: " + vehicle);
} else
{
System.out.println("Cannot repair this: " + vehicle);
}
}
通過這個例子我們可以看到,結(jié)合Extract Method和Inline Method重構(gòu)可以解決更復(fù)雜的問題。
我們改變了應(yīng)用邏輯,現(xiàn)在當(dāng)運行下面最后三行代碼時,可以看到我們的代碼不僅可以處理Car,而且在需要小修時也可以處理Truck,而在我們進(jìn)行多步驟重構(gòu)之前,并不是這樣的。
class RepairShop { public static void main(String[] args) { CarMechanic cm = new CarMechanic(); Vehicle v1 = new Car(Vehicle.FailureCondition.ENGINE_FAILURE); Vehicle v2 = new Truck(Vehicle.FailureCondition.ENGINE_FAILURE); Vehicle v3 = new Truck(Vehicle.FailureCondition.FLAT_TIRE); cm.repair(v2);//Repairing: Car, ENGINE_FAILURE cm.repair(v2);//Cannot repair this: Truck, ENGINE_FAILURE cm.repair(v3);//Repairing: Truck, FLAT_TIRE } }
您并不總是需要復(fù)雜的解決方案來有效地重構(gòu)代碼-有時您只需要了解基礎(chǔ)知識即可。
好了這就是今天的內(nèi)容了,如果今天的文章未解決你的需求,可點擊獲取更多免費教程。不要忘了在評論與我們分享您的想法和建議,慧都作為IntelliJ IDEA正版合作商,我們推出"軟件國產(chǎn)化服務(wù)季"活動(點擊查看詳情)!現(xiàn)IntelliJ正版授權(quán)在線訂購最高立減3000元!低至1333!還有多種授權(quán)方式供你選擇。
====================================================
想要了解或購買IntelliJ IDEA正版授權(quán)的朋友,歡迎
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: