Недавно я узнал, что PHP 5.3 поддерживает новую конструкцию языка GOTO
. Все знают, что он делает. Однако это не совсем традиционный GOTO
, это просто ярлык перехода. Мне интересно узнать, является ли этот GOTO
злом и подразумевает плохой код?
Если вы не программируете на ассемблере, GOTO всегда следует рассматривать так же, как и жилет для жизни самолетов: хорошо иметь их в наличии, но если вам нужно их использовать, это означает, что у вас большие проблемы.
Не могу поверить, что никто не писал это 🙂
Конечно, PHP не компилируется … Может, хищник будет преследовать вас при каждом посещении вашего сайта?
Плохая структуризация кода зла, независимо от структуры управления, которую вы используете.
Я лично предпочитаю goto, который очищает поток программы, чтобы «управлять переменными» и вложенным «if», что косвенно приведет к одной и той же ветви в коде.
Итак, просто напишите две версии (с GOTO и без нее) и посмотрите, какой из них легче понять. Тогда выбор прост.
Я нахожусь в меньшинстве (в настоящее время), но я считаю, что ограничения, связанные с конструкцией goto PHP, делают очень полезный инструмент:
http://adamjonrichardson.com/2012/02/06/long-live-the-goto-statement/
Я действительно просматриваю пример кода стрелки (глубоко вложенные условные выражения) и рефакторизую его с помощью стандартных практик (оговорки о защите, условия группировки, вытаскивание функций) в одной версии и версии на основе goto в другой версии, и я действительно предпочитаю ресонирование на основе goto.
Я думаю, что это самая важная часть справочной страницы PHP и отсутствует здесь:
Это не полный неограниченный переход . Метка-мишень должна быть в том же файле и контексте, что означает, что вы не можете выпрыгнуть из функции или метода и не можете перейти в одну . Вы также не можете переходить в какую-либо петлю или структуру коммутатора. Вы можете выпрыгнуть из них, и обычным явлением является использование goto вместо многоуровневого перерыва.
ИМХО это очень сильно отличается от устаревших стилей BASIC .
Являются ли орудия злыми? Оба могут быть использованы для добра или зла. Я бы сказал, что легче писать хороший код без goto, чем с.
Любая языковая функция, которая может сделать код более читаемым в данной ситуации, – это хорошая вещь. GOTO – одна из таких особенностей языка, даже если таких ситуаций мало и далеко. Если мы запретили какой-либо синтаксис, который позволил бы бедным программистам писать плохой, неподъемный код, наши задания были бы намного сложнее.
Будучи инженером-программистом, я в основном работаю над «мэйнфреймами» и «большими корпоративными серверами» … И наш ежедневный язык (я имею в виду один из 95% нашего базового кода) – это Cobol, который широко использует GOTO.
Это использование не означает, что код плохой. Это просто означает, что этот инструмент (GOTO) был правильным в тот момент, когда были написаны программы.
Чтобы ответить на вопрос Кайтсули, я думаю, что это может быть полезным инструментом при написании PHP-скриптов. С другой стороны, уже почти десять лет без него было достигнуто множество сценариев. Кроме того, это противоречит эволюции PHP с более объектно-ориентированными функциями.
ИМХО, это нехорошо и не плохо для кода: хорошие программы по-прежнему будут хорошими, а «программы ужасов» будут хуже … Единственный вопрос: «Зачем добавлять GOTO через 10 лет после подтверждения, что это не нужно? ».
GOTO обычно злой, потому что он позволяет вам создавать неструктурированный код. С помощью обычных циклов вы можете легко построить хороший структурированный код, потому что он структурирован.
Когда у вас есть неструктурированный код, прыгающий сюда, вы только что обнаружили зло, исходящее из заявления GOTO. Почти всегда лучше избегать этого. Может быть, раз каждые 100 000 строк есть место, где предложение GOTO упрощает LOT, код не является злым, но если вы не уверены, тогда вам следует избегать GOTO.
Надеюсь это поможет.
EDIT: Ну, просто чтобы добавить мое собственное мнение здесь, есть другие инструкции, которые позволяют вам создавать неструктурированный код и которые не считаются злыми, когда я думаю, что они должны быть.
Например, возвращение в середине функции – это GOTO до конца, поэтому я избегаю их и использую только один возврат в каждой функции только в конце.
Другие языки, такие как Vb.Net (возможно, другие), позволяют делать Exit For, Exit While, breaks и т. Д., Которые также неструктурируют код, и я думаю, этого следует избегать.
иногда (я имею в виду в 0,01% случаев), это полезно, например, когда у вас длинный длинный скрипт, и вы хотите протестировать некоторые блоки. но никогда не оставляйте его в своем финальном сценарии
Я использовал GOTO, когда писал сценарий для работы в режиме cli. Это спасает мою жизнь.
GOTO следует удалить с языка. Если у кого-то есть необходимость «безоговорочно передать управление», тогда им нужно вернуться в школу, чтобы изучить Структурированное программирование 101