Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何重构这个有多个if/else语句的方法_Java_Refactoring - Fatal编程技术网

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

Java 如何重构这个有多个if/else语句的方法,java,refactoring,Java,Refactoring,我有一种感觉,这个if/else应该被重构,但我不确定我能做什么,或者我是否应该让它保持原样 private String someReportUrl(HttpServletRequest request, HttpServletResponse response) { String url; if (isBackToReportsSummary(request)) { url = SUMMARY_PAGE; getReportsSummary(r

我有一种感觉,这个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;
}

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

如果您确实想更改它,您可以将
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;
}
但实际上,这一切都很好。

这种“基于守卫”的风格怎么样?它通常使方法更容易从上到下阅读

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";
}
首先看一看这个。它应该重构
if/else
的职责,使其更有组织性和可维护性。然后您的代码应该如下所示:

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


您可以在命令模式中收集更多知识

您的代码就是这样。 但如果您想在一行中实现同样的效果,也可以考虑使用?:运算符

例如:

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");

随它去吧。它很漂亮,因为它很简单。我在你的代码中没有看到任何不必要的东西,它的作用也很清楚。把它原封不动,留着它,或者使用Sprint MVC或JSF来定义NaveRuleSeCI,只使用多个<代码>返回<代码>语句,而不是中间变量,但有些人认为这是一个糟糕的做法。否则您的代码就可以了。责任链可能是一个不错的选择,但不是在这么简单的情况下。+1我认为这是最好的方法-它很清楚,消除了不必要的局部变量。正确!但如果@Mike想要取消if-else条件,我看不到任何其他选项。