2012-11-04 26 views
4

我的代碼片段如下:Java類設計 - 有太多的如果條件

public void execute(Parameters params) { 
    Long requestType = params.getRequestType(); 
    // Based on the requestType the name of the project would be different 
    getName(requestType); 
    // Same as above 
    getDescription(requestType) 
    // Project here is a collection of different requests 
    Long projectId = createProject(name, description) 
    RequestContents requestContents = params.getRequestContents(); 
    for(RequestContent requestcontent : requestcontents) { 
     Long requestId = createRequest(name, description, projectId); 
     updateRequest(requestId, requestContent1); 
    } 
    // Based on the requestType, mail content would differ 
    String mailContent = getMailContent(requestType, projectId) 
    sendMail(mailContent); 
} 

的功能sendMailcreateProject輸出,createRequest依賴於requestType,等等這些功能最終將有多個if-else條件。 建立這個班級的正確方法是什麼,以避免這種情況?

回答

3

一種方式是創建一個抽象類AbstractRequest有抽象方法sendMailcreateProject等,然後有幾個具體的子類RequestType1RequestType2等各自具有不同的實施sendMail等我想他們稱之爲策略模式。

+0

他們實際上稱之爲多態:http://sourcemaking.com/refactoring/replace-conditional-with-polymorphism –

+0

而不是請求,我會重構包含上面的exectue()方法的類。 –

+0

@ jordan002謝謝,模式對我來說很難。所以你的意思是這不是一個戰略模式? –

1

double dispatch使用:

public class Sender { 

    public void sendMail(RequestType1 requestType, String mailContent) { 
     // some impl 
    } 
    public void sendMail(RequestType2 requestType, String mailContent) { 
     // some impl 
    } 
    public void sendMail(RequestType3 requestType, String mailContent) { 
     // some impl 
    } 
} 

然後

sender.sendMail(requestType, mailContent); 

調用的實際方法是基於requestType對象的類型在運行時確定。看不到「如果」。


您可以簡單地在本地實現這些方法,但這會造成混淆,難以閱讀。最好把這個問題分解成一個單獨的課程。

+2

-1我會在這裏應用簡單的多態,而不是方法重載。我會去找一個帶有sendMail,createProject等方法的請求接口和一個基於參數實例化正確具體類型的工廠。 – ewernli

+1

@ewernli在這種情況下,最好**在投票前寫下答案**。 –

+1

@ewernli所以這個意見使得這個答案「沒有用」呢? (「沒有用」是downvoting的意思表示 - 不是你覺得有更好的答案) – Bohemian

0

如果requestType是一組有限的String值,那麼可以爲它創建一個匹配的Enum。

enum RequestType{ 
    type1,type2,...; 
} 

然後,您可以轉換的if-else更緊湊的switch-case:

switch (RequestType.valueOf(requestType)){ 
    case type1: 
     .... 
    break; 
    case type2: 
     ... 
    break; 
    ... 
    default: 
} 

從代碼,請求類型是一個長期的,您可以直接在其切換:

switch (requestType){ 
    case type1: 
     .... 
    break; 
    case type2: 
     ... 
    break; 
    ... 
    default: 
} 
+0

如果您使用的是Java7,則可以直接打開字符串而不必通過枚舉; – thedayofcondor

+0

requestType不是字符串。 –

0

爲什麼不把if-else條件放在execute()方法本身中,並基於那個調用其他方法並傳遞相關參數。這樣你將創建sendmail,createproject,createrequest的通用函數。