3

Javaでこれをリファクタリングするベストプラクティスは何ですか?

while (1) {
  // initialisation

  for (int i = 0; i < MAX_ATTEMPT; i++) {
    if (try_something()) goto step2;
  }
  continue;

step2:  
  for (int i = 0; i < MAX_ATTEMPT; i++) {
    if (try_next_thing()) goto step3;
  }
  continue;

step3:
  ...
}    
4

7 に答える 7

2

文字通りですが、あなたができる最高の翻訳ではありません。コードを生成する必要があり、それを回避する簡単な方法がない場合を除き、goto として break を使用することはお勧めできません。

while (true) {
    // initialisation

    step2:
    {
        for (int i = 0; i < MAX_ATTEMPT; i++) {
            if (try_something()) break step2;
        }
        continue;
    }

    step3:
    {
        for (int i = 0; i < MAX_ATTEMPT; i++) {
            if (try_next_thing()) break step3;
        }
        continue;
    }

    step4:
    ...
}
于 2013-08-06T09:25:03.297 に答える
1

最善の解決策ではないかもしれませんが、通常は次のようにします。

boolean success = false;

for (int i = 0; i < MAX_ATTEMPT && !success; i++) {
    success = try_something()
}

if (success) {
    success = false;
    for (int i = 0; i < MAX_ATTEMPT && !success; i++) {
        success = try_next_thing();
    }
}

それが役立つことを願っています。

于 2013-08-06T09:26:55.967 に答える
0

私にとって最も効果的なのは、関数間でロジックを分割することです。これが私が考えていることです:

bool attempt_something() {
   for(int i = 0; i < MAX_ATTEMPT: i++) {
      if (try_something())
         return true;
   }
   return false;
}

bool attempt_something_else() {
   for(int i = 0; i < MAX_ATTEMPT: i++) {
      if (try_something_else())
         return true;
   }
   return false;
}

そしてあなたの時間は

while (1) {
   if (!attempt_something())
      continue;
   if (!attempt_something_else())
      continue;
   ...
}
于 2013-08-06T09:55:27.607 に答える
0

コードを C のオブジェクト指向設計に変換することから始めます。コードは本質的にステート マシンであるため、ステート マシンに置き換えることができるはずです。

典型的な関数ポインタベースのステートマシンの例:

typedef bool (state_t*)(void);

state_t state [STATES_N] = {   // array of function pointers
  &try_something,
  &try_next_thing,
  ...
};


int state = 0;  

while (1) {

  for (int i = 0; i < MAX_ATTEMPT; i++) {

    if(try[state]()) {
      state++;
      if(state == STATES_N) {
        state = 0;
      }
    }
  }
}

これを Java OO に変換するには、各状態をクラスのオブジェクトと交換することになると思います。クラスには try 関数があります。

于 2013-08-06T11:14:27.993 に答える