Axel
Мастер
(1926)
13 лет назад
Не следует избегать. Следует не злоупотреблять его использованием.
Основная критика данного оператора - при его использовании код теряет так называемую блочность.
То есть, любая часть программы разделена на блоки, ограниченные какими-либо операторами for-next begin-end repeat-until if-endif в паскале и бейсикоподобных или {фигурные скобки} в сиподобных. И визуально всё это воспринимается, как отдельные куски программы, в рамках которых идёт выполнение алгоритма. GOTO позволяет совершить безусловных переход из одного блока в другой, в результате чего код уже нельзя видеть, как нормальную структуру. Чрезмерное использование GOTO превращает код в так называмое "спагетти", когда сложно понять, откуда куда идёт выполнение.
Однако, это не значит, что использовать данный оператор вообще запрещено (это уже фанатизм) , можно столкнуться с тем, что его использование как раз таки сделает код более читаемым.
Например, есть три вложенных цикла, требуется при выполнении какого-то условия в самом нижнем цикле сделать выход из всех трёх, но без вынесения в процедуру (скажем, поиск первого нулевого элемента в трёхмерном массиве) . Без GOTO потребуется заводить переменную "флаг", для того чтобы последовательно выйти из одного цикла, потом из другого, потом из третьего, что выйдет в 5 строк кода и кучу проверок этого флага в каждом цикле при каждой итерации. Использование одного GOTO сократит решение до одной строки и проверок только в одном цикле. Читабельность код от этого не потеряет, скорее наоборот, есть одно чёткое условие и метка, визуально это воспринимается легче, чем 3 условия, раскинутые по разным циклам. Пример не идеальный, со многими "если", но на то он и пример.
Так что, именно "избегать" не следует. Следует продумывать в каждом случае, оправдает ли себя его применение и не ухудшит ли это визуальное восприятие кода.