如何重构具有多个if/else语句的方法

5

我感觉这个if/else语句需要重构,但我不确定该怎么做,或者是否应该让它保持原样...

private String someReportUrl(HttpServletRequest request, HttpServletResponse response) {
    String url;
    if (isBackToReportsSummary(request)) {
        url = SUMMARY_PAGE;
        getReportsSummary(request, response);
    } else if (isComingFromPageA(request)) {
        url = getTabUrl(request, REPORT_URL_FOR_PAGE_A);
    }
    else {
        url = "/standAlone/reportUrl.jsp";
    }
    return url;
}

基本上,我有一个报告汇总页面,列出了三到四个报告。第一个条件是当用户想要返回到该页面时,第二个条件是当用户选择了这个特定的报告,第三个条件是当用户将此报告作为单独报告选择(不是从汇总页面选择)。


让它保持原样。它之所以美丽,是因为它简单。 - Nishant
我在你的代码中没有看到任何不必要的东西,而且它非常清楚它所做的事情。保持原样。 - Keppil
使用Spring MVC或JSF来定义导航规则。请勿添加机器翻译的风格,保持流畅、专业和优雅。 - Aravind Yarram
1
我会只使用多个return语句而非中间变量,但是有些人认为这是不好的做法。除此之外,你的代码没问题。责任链模式可能是一个不错的选择,但在这样一个简单的情况下并不适用。 - Tomasz Nurkiewicz
4个回答

7

首先看一下设计模式命令。它应该重构if/else的责任,使其更有组织性和可维护性。然后你的代码应该像这样:

示例

class ExampleServlet  {

  private HashMap commandMap = new HashMap();

  public ExampleServlet() {
    commandMap.put("create", new ActionTypeCreate());
    commandMap.put("replace", new ActionTypeReplace());
    commandMap.put("update", new ActionTypeUpdate());
    commandMap.put("delete", new ActionTypeDelete());
  } //endconstructor
} //endclass: ExampleServlet

private void performTask(String action) {
    ActionType cmd = (ActionType)commandMap.get(action);
    cmd.execute();
} //endmethod: performTask

这里 你可以获取更多关于命令模式的知识


5
如果你一定要更改它,你可以将url初始化为默认返回值,并在满足两个条件之一的情况下再进行更改:
private String someReportUrl(HttpServletRequest request, HttpServletResponse response) {
    String url = "/standAlone/reportUrl.jsp";
    if (isBackToReportsSummary(request)) {
        url = SUMMARY_PAGE;
        getReportsSummary(request, response);
    } else if (isComingFromPageA(request)) {
        url = getTabUrl(request, REPORT_URL_FOR_PAGE_A);
    }
    return url;
}

但实际上,它现在的状态已经很好了。


5
这种“基于保护”的风格如何?它通常使方法从上到下更容易阅读。
private String someReportUrl(HttpServletRequest request, HttpServletResponse response) {
    if (isBackToReportsSummary(request)) {
        getReportsSummary(request, response);
        return SUMMARY_PAGE;
    } 
    if (isComingFromPageA(request)) {
        return getTabUrl(request, REPORT_URL_FOR_PAGE_A);
    }
    return "/standAlone/reportUrl.jsp";
}

2
+1 我认为这是最佳的方法 - 它清晰地消除了一个不必要的局部变量。 - mikera

0
你的代码已经很好了。 但是,如果你想在一行中实现相同的效果,也可以考虑使用 ?: 运算符。
一个例子如下:
class round{
    public static void main(String args[]){

    int sampleInt=3;
    if(sampleInt==1){
        sampleInt = 5;
        System.out.println("One");
    }
    else if(sampleInt==2){
    sampleInt = 3;
        System.out.println("Two");
    }
    else{
        sampleInt = 4;
        System.out.println("Else");
    }

    sampleInt = sampleInt==1?5:(sampleInt==2?3:4);
    System.out.println("sampleInt "+sampleInt);
}
}

最终,您的代码将看起来像这样:

   url = isBackToReportsSummary(request)==true?SUMMARY_PAGE:(isComingFromPageA(request)==true?getTabUrl(request, REPORT_URL_FOR_PAGE_A):"/standAlone/reportUrl.jsp");

正确!但是如果@Mike想要摆脱if else条件,我看不到其他选择。 - afrin216

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接