[置頂] 重新組織函數(shù)----Extra Method(提煉函數(shù))
來源:程序員人生 發(fā)布時(shí)間:2015-01-07 08:19:28 閱讀次數(shù):3273次
你有1段代碼可以被組織在1起并獨(dú)立出來
講這段代碼放在1個(gè)獨(dú)立函數(shù)中,并讓函數(shù)名稱解釋該函數(shù)的用處
范例:無局部變量
void printOwing(double amount){
printBanner();
//printDetail
System.out.println("name:"+_name);
System.out.println("amount:"+amount);
}
重構(gòu)后代碼:
void printOwint(double amount){
printBanner();
printDetail(amount);
}
void printDetail(double amount){
System.out.println("name:"+_name);
System.out.println("amount:"+amount);
}
動(dòng)機(jī)
Extra Method(提煉函數(shù))是最經(jīng)常使用的重構(gòu)手法之1。當(dāng)看見1個(gè)太長(zhǎng)的函數(shù)或1段需要注釋才能讓人理解用處的代碼,就應(yīng)當(dāng)將這段代碼放進(jìn)1個(gè)獨(dú)立的函數(shù)中去。
范例:有局部變量
果真這么簡(jiǎn)單?這個(gè)重構(gòu)手法的困難點(diǎn)在哪里?是的,就在局部變量,包括傳進(jìn)源函數(shù)的參數(shù)和源函數(shù)所聲明的零時(shí)變量。局部變量的作用域僅限于源函數(shù),所以當(dāng)我使用Extra Method(提煉函數(shù))時(shí),必須花費(fèi)額外工夫去處理這些變量。某些時(shí)候它們可能妨礙我,使我根本沒法進(jìn)行這項(xiàng)重構(gòu)。
局部變量最簡(jiǎn)單的情況是:被提煉代碼段只是讀取這些變量的值,其實(shí)不修改它們。這類情況可以簡(jiǎn)單的將它們當(dāng)作參數(shù)傳給目標(biāo)函數(shù)
void printOwing{
Enumeration e=orders.elements();
double outstanding=0.0;
printBanner();
//calculate outstanding
while(e.hasMoreElements){
Order order=(Order)e.nextElement();
outstanding +=each.getAmount();
}
System.out.println("name:"+_name);
System.out.println("amount:"+outstanding);
}
就能夠講打印詳細(xì)信息提煉為帶1個(gè)參數(shù)的函數(shù):
void printOwing{
Enumeration e=orders.elements();
double outstanding=0.0;
printBanner();
//calculate outstanding
while(e.hasMoreElements){
Order order=(Order)e.nextElement();
outstanding +=each.getAmount();
}
printDetails(outstading);
}
void printDetails(double outstanding){
System.out.println("name:"+_name);
System.out.println("amount:"+outstanding);
}
必要的話可以用這類手法處理多個(gè)局部變量
范例:對(duì)局部變量再賦值
如果被提煉的代碼對(duì)局部變量賦值,問題就變得復(fù)雜了。這里只討論臨時(shí)變量的問題。如果你發(fā)現(xiàn)源函數(shù)的參數(shù)被賦值,應(yīng)當(dāng)馬上使用Remove Assignments to Parameters(131)。
被賦值的臨時(shí)變量也分為兩種情況。較簡(jiǎn)單的情況是:這個(gè)變量只在被提煉的代碼段中使用。果真如此,你可以將這個(gè)臨時(shí)變量的聲明移動(dòng)到被提煉的代碼段中,然后1起提煉出去。另外一種情況是:被提煉代碼段以外的代碼也使用了這個(gè)變量。這又分為兩種情況:如果這個(gè)變量在被提煉代碼段以后再未被使用,你只需要在目標(biāo)函數(shù)中修改它就能夠了;如果被提煉代碼段以后的代碼還使用了這個(gè)變量,你就需要讓目標(biāo)函數(shù)返回該變量改變后的值。以下代碼可以說明這幾種不同的情況。
void printOwing(){
Enumeration e=_orders.elements();
double outstanding=0.0;
printBanner();
//calculate outstanding
while(e.hasMoreElements){
Order order=(Order)e.nextElement();
outstanding+=order.getAmount();
}
printDetails(outstanding);
}
現(xiàn)在把“計(jì)算”代碼提煉出來:
void printOwing(){
printBanner();
double outstanding=getOutstanding();
printDetails(outstanding);
}
double getOutstanding(){
Enumeration e=_orders.elements();
double outstanding=0.0;
while(e.hasMoreElements){
Order order=(Order)e.nextElement();
outstanding+=order.getAmount();
}
return outstading;
}
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)