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;
}

基本上我有一个报告摘要页面,其中列出了三到四个报告。第一个条件是用户想要返回该页面时,第二个条件是用户选择此特定报表时,第三个条件是用户选择此报表作为独立报表时(不是来自摘要页面) .

4

4 回答 4

7

首先看一下设计模式命令。它应该重构if/else's 的责任,使其更有条理和更易于维护。然后你的代码应该是这样的:

例子

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

在这里您可以收集更多关于命令模式的知识

于 2012-07-28T15:20:43.383 回答
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;
}

但实际上,这很好。

于 2012-07-28T15:09:11.683 回答
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";
}
于 2012-07-28T15:11:24.103 回答
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");
于 2012-07-28T15:38:13.527 回答