4

带有 checkcustomers 的“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;

}
4

5 回答 5

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...在一个枚举中。

于 2012-12-27T23:41:55.850 回答
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();

}

于 2012-12-27T23:44:21.023 回答
1

将返回值替换为对结果变量的赋值,该变量在第一次赋值之前保持为空。如果更改结果的条件为假,则每个块都可以被一个返回 null 的函数替换。

正如赫尔曼在评论中指出的那样,这仅在 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;

}
于 2012-12-27T23:46:04.347 回答
0

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

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

于 2017-09-27T11:17:25.410 回答
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。

于 2016-04-18T20:05:36.260 回答