Несколько хороших ответов (особенно сейчас у Гарретта) на сложный вопрос, но я добавлю свои $ 0,02 для потомков.
Здесь нет простого ответа о том, как реорганизовать этот блок, не видя фактический кодно моя реакция на это заключается в том, что он должен быть переработан.
Например, способ вызова break;изнутри функции check ().(Возможно, на других языках программирования)
Если вы запрашиваете другой разрыв, который Java не поддерживает (без взлома), и у вас есть дублированный check()
и различные различные коды выхода / повторения цикла, это указывает надля меня это большой и сложный метод.Вот несколько идей для размышления:
Каждый из блоков some code here
что-то делает.Если вы примените их к своим собственным методам, как это изменит цикл?
Может быть, разбить цикл на серию комментариев.Не углубляйтесь в код, но подумайте об этом концептуально, чтобы увидеть, выпадает ли другая конфигурация.
Был ли у вас другой разработчик в вашей организации, который не связан с этим кодом?взгляд на это?Если вы подробно объясните, как работает код кому-то, они могут увидеть некоторые шаблоны, которыми вы не являетесь, поскольку вы в сорняках.
Я также думаю, что идея @ aix о конечном автоматеэто хорошо, но мне приходилось использовать такой механизм очень редко в моих путешествиях по программированию - в основном во время распознавания образов.Я подозреваю, что редизайн кода с меньшими блоками кода, включенными в методы, будет достаточен для улучшения кода.
Если вы хотите реализовать конечный автомат, вот еще некоторые подробности.Вы могли бы иметь цикл, который выполнял только один оператор switch, который вызывал методы.Каждый метод возвращает следующее значение для переключателя.Это не полностью соответствует вашему коду, но что-то вроде:
int state = 0;
WHILE: while(true) {
switch (state) {
case 0:
// 1st some code here
state = 1;
break;
case 1:
state = check();
break;
case 2:
return;
case 3:
break WHILE;
case 4:
// 2nd some code
state = 1;
break;
...
}
}
Надеюсь, что это поможет и удачи.