2011-09-07 118 views
5

我遇到了這個代碼,其中一個方法調用,例如ClassA.search(a,b,flag)正在被3個控制器使用。這是該方法的簡化版本:這是重用/共享方法的好方法嗎?

public List<Result> search(Object a, Object b, boolean flag) { 
    //do some code logic here, common to the 3 controllers 
    //at the middle there is: 
    if (flag) { 
     //code that affects 2 Controllers 
    } else { 
     //code affects only 1 
    } 
    //some more common code 
    //some more code with the flag if else 
} 

這是一個好主意,因爲代碼被重用?還是有更好的方法仍然能夠重用代碼,但不會引入方法調用者(客戶端)代碼自定義的這個標誌(例如可能將其分割爲3種不同的方法,但仍然能夠聲明通用代碼重構方法)?

回答

6

首先,提取與評論功能線:

public void search(Object a, Object b, boolean flag) 
{ 
    commonToThree(); 
    if (flag) 
    { 
     affectTwoControllers(); 
    } 
    else 
    { 
     affectsOnlyOne(); 
    } 
    alsoCommon(); 
} 

現在擺脫flag布爾的說法,這是一個代碼味道:

public void searchWithTrueFlag(Object a, Object b) { 
    commonToThree(); 
    affectTwoControllers(); 
    alsoCommon(); 
} 

public void searchWithFalseFlag(Object a, Object b) { 
    commonToThree(); 
    affectsOnlyOne(); 
    alsoCommon(); 
} 
+0

我同意這一點,只要你不把局部變量變成字段來使它工作。 –

+0

爲什麼你會發現局部變量不好?如果您必須反覆遍歷參數的狀態非常重要,請創建一次性對象,並將狀態初始化爲構造函數中的最終字段並僅使用一次。功能類固醇;-)。 –

+0

這是真的,但添加一個類與字段(和一個構造函數?)是很多工作,以避免一個標誌。 ;) –

3

這很好但不是很好。一個布爾值是有道理的,但如果你開始添加更多的布爾值,那麼你不會進入正確的方向。

這並不總是可能的,但通常能產生更好的代碼做:

functionOne: 
    sharedCodeOne() 
    specificCode 
    sharedCodeTwo() 

functionTwo: 
    sharedCodeOne() 
    specificCode 
    sharedCodeTwo() 

一如往常,這是很難做出廣義聲稱:這顯然並不總是可能/實用。

+1

+1:如果代碼的三個部分不共享任何局部變量,這很好。(或者只是分享一小部分) –

+1

@彼得:我完全同意 - 我認爲這種方法的實際和優勢在於它促使您減少局部變量的數量和範圍。 (雖然有些人可能傾向於把他們變成封閉類的領域,使事情變得糟糕) –

+1

@Arnout Engelen,我同意添加字段來完成這項工作並不是一個好主意。 –

0

這是一個相對簡單的方法來做到這一點。有替代品,但它們可能更加複雜。 (例如傳遞訪問者或調用控制器的方法來說明對該控制器做什麼)

如果您在代碼的三個部分之間共享局部變量並且您將不得不使用字段,那麼此方法是最好的。

0

我會採取不同的方式試圖回答這個問題一般來說:

主要目標應該是乾淨代碼。究竟是什麼,當然取決於具體情況。但是可以肯定的是,在多個地方使用複製粘貼的代碼是不好的,因爲如果必須進行更改,這需要更改幾個位置 - 而且,嘗試提取公共部分是不好的,因爲不止一個部分正在使用他們在任何情況下。

總是想象有人必須閱讀你的代碼(或者你自己必須從現在開始幾周內完成),並且儘可能快地理解那裏發生了什麼。所以,這取決於特殊情況,如果最好複製一些行或用一種常用方法提取它們。

一個標誌本身並不壞,但它並不是真正應該在java方法中過度使用的東西。通常情況下,這種情況可以通過重載方法並在另一方中使用一種方法來很好地解決,因此常見情況是在一個情況下完成的,而在另一個情況下是特殊情況。或者,您可以有幾個子方法,並通過多次調用來編寫您的方法,但只有在您不需要傳遞太多參數時纔有意義。

一個規則(完全是主觀的,但基於從許多項目中吸取的教訓)我可以給你:喜歡具體的實現ober通用方法。它們可能導致更多的代碼,並且可能看起來不太聰明,但它們更容易理解,擴展和調試。