Java 如何重构这个有多个if/else语句的方法
我有一种感觉,这个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
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条件,我看不到任何其他选项。