Сначала нужно определить, что код пытается выполнить:
- Выполните следующие действия снова и снова:
- Зов try_something() до MAX_ATTEMPT раз, перезапуск, если он никогда не возвращает истину.
- Вызов try_next_thing() до MAX_ATTEMPT раз, перезапуск, если он никогда не возвращает true.
Затем, написать код, который делает это, например .:
while (true) {
int i;
for (i = 0; i < MAX_ATTEMPT && !try_something(); ++ i)
;
if (i == MAX_ATTEMPT)
continue;
for (i = 0; i < MAX_ATTEMPT && !try_next_thing(); ++ i)
;
if (i == MAX_ATTEMPT)
continue;
// etc.
}
Есть много других способов, чтобы выразить это. Например, вы могли бы сломать каждый шаг в методе, и воспользоваться тем, что & & прекратит оценивать свои аргументы, когда одна ложь:
boolean doFirstThing() {
int i;
for (i = 0; i < MAX_ATTEMPTS && !try_something(); ++ i)
;
return i < MAX_ATTEMPTS;
}
boolean doSecondThing() {
int i;
for (i = 0; i < MAX_ATTEMPTS && !try_other_thing(); ++ i)
;
return i < MAX_ATTEMPTS;
}
// then, elsewhere
while (true)
doFirstThing() && doSecondThing();
или любой другой. Я не уверен, что я бы назвал последнее «лучшей практикой», поскольку он немного запутан (это не значит, что это не подходит в определенных ситуациях), но это всего лишь пример. В общем, при переносе на другой язык: проанализировать оригинал -> что он должен делать? -> reimplement на целевом языке. Приоритет - это правильность кода, вторая (но далеко не позади) является ясностью.
Что касается подавления gotos, другие предоставленные ответы. Что касается части java: каковы ваши ожидания? Вы ищете объектно-ориентированный рефакторинг? –
Нет, просто управление потоком. – fadedbee
Зачем реорганизовывать этот код? Код читаем и легко отслеживаем. Почему вы не хотите удалять утверждения 'goto'? – Bart