Java类设计 - 如果条件太多

时间:2012-11-04 17:05:51

标签: 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); 
}

函数sendMailcreateProjectcreateRequest的输出取决于requestType,因此这些函数最终会有多个if-else条件。 为避免这种情况,对这个类进行建模的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

一种方法是创建一个抽象类AbstractRequest,它有抽象方法sendMailcreateProject等,然后有几个具体的子类RequestType1 RequestType2等有sendMail等不同的实现。我猜他们称之为策略模式。

答案 1 :(得分: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 :(得分:0)

如果requestType是一组有限的String值,则可以为它创建匹配的Enum。

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

然后,您可以将if-else转换为更紧凑的switch-case:

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

从代码中,requestType很长,你可以直接打开它:

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

答案 3 :(得分:0)

为什么不将if-else条件放在execute()方法本身中,并基于该调用其他方法并传递相关参数。这样您就可以创建sendmail,createproject,createrequest的通用函数。