4

checkcustomers を含む「if」ブロックは、このクラスの他のメソッドでそのまま使用されるため、同じチェックに対して多くのコード重複があります。しかし、戻り値があるため、この checksomethings を 1 つのメソッドに直接抽出することもできません。

このコードをリファクタリングするための良いアイデアはありますか? ここで単純化するためにこのコードを変更したので、このコードの小さな問題 (もしあれば) に引っかからないようにしてください。その現在の方法で多くのリターン。

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

呼び出しチェック関数を 2 回回避しようとする場合は、結果を維持するだけです

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 のままである結果変数への割り当てに置き換えます。各ブロックは、結果を変更する条件が 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;

}
于 2012-12-27T23:46:04.347 に答える