使用return语句重构代码

时间:2012-12-27 23:35:13

标签: java refactoring

带有checkcustomer的“if”块在这个类的其他方法中使用完全正确,因此对于相同的检查有很多代码发布。但我也不能直接将这种检查方法提取到一个方法,因为它们有返回值。

重构此代码的一些好主意?我刚刚修改了这段代码以简化这里,所以不要抓住这段代码中的小问题(如果有的话),基本上问题是如何将一段代码提取到一个方法(因为它在其他方法上被公开)当有当前方法中的许多回报。

public Details getCustomerDetails(){

   if(checkifcustomerhasnoboobs){    
    ..worry about it..
   return new Details("no");
  }

   if(checkifcustomerplaytenniswell){    
    ..do find a tennis teacher
    return new Details("no cantplay");
  }
  //...ok now if customer passed the test, now do the some real stuff
  //
  //
  CustomerDetails details= getCustomerDetailsFromSomewhere();

  return details;

}

5 个答案:

答案 0 :(得分:2)

这个怎么样?

public Result checkSomethings() {
  if ( checksomething1 ) {
    return ResultCheckSomething1;
  }
  if ( checksomething2 ) {
    return ResultCheckSomething2;
  }
  return ResultCheckNone;
}

public Details getCustomerDetails(){
  Result result = checkSomethings();
  switch ( result ) {
    case ResultCheckSomething1:
      return new Details("message1");
    case ResultCheckSomething2:
      return new Details("message2");
    default:
      return getCustomerDetailsFromSomewhere();
  }
}

Result...代码将在枚举中。

答案 1 :(得分:1)

也许是这样的?

   public Details getCustomerDetails(){
       boolean isError = checksomething1() || checksomething2();
       String message = checksomething1() ? "message1" : "message2";
       return isError ? new Details(message) : getCustomerDetailsFromSomewhere();
}

如果您尝试避免两次通话检查功能,请保持结果

public Details getCustomerDetails(){
   boolean check1 = checksomething1();
   boolean check2 = checksomething2();
   String message = check1 ? "message1" : "message2";
   return (check1 || check2) ? new Details(message) : getCustomerDetailsFromSomewhere();

}

答案 2 :(得分:1)

将带有赋值的返回值替换为结果变量,该变量在第一次赋值之前保持为null。如果用于更改结果的条件为false,则每个块都可以由返回null的函数替换。

正如herman的评论所指出的,只有当null不是其中一个调用的可能结果时,这才有效。

public Details getCustomerDetails(){
   Details result = null;

   if(checksomething1){    
    ..error
     result = new Details("message1");
  }

  if(result == null) {
    if(checksomething2){    
    ..error
    result = new Details("message2");
  } 

  if(result == null){

    result = getCustomerDetailsFromSomewhere();
  }

  return result;

}

答案 3 :(得分:0)

我会这样做:

public Details getCustomerDetails(){  

  Details invalidDetails = checkForInvalidCustomer();
  if (invalidDetails !=null) {
     return (invalidDetails);
  }

  //...ok now if customer passed the test, now do the some real stuff
  //
  //
  CustomerDetails details= getCustomerDetailsFromSomewhere();
  return details;
}

public Details checkForInvalidCustomer() {
   if(checkifcustomerhasnoboobs){    
    ..worry about it..
    return new Details("no");
   }
   if(checkifcustomerplaytenniswell){    
    ..do find a tennis teacher
    return new Details("no cantplay");
  }
  // nulls means valid customer
  return (null);
}

基本上,对于您的具体示例,我使用null,以便我可以区分没有条件匹配的情况,与任一条件匹配。这样我可以使用单个if语句。现在,如果你想返回null,你需要稍微修改这个解决方案,也许使用一些常量来标记大小写,而不是使用null。

答案 4 :(得分:0)

使用Java 8,您可以重构为返回Optional<...>值的方法。 像return x;这样的语句将被return Optional.of(x)替换(假设x不能为空)。最后的默认return语句为return Optional.empty()

然后,您可以使用return optional.orElseGet(() -> ...))计算未达到原始返回语句的情况的值。