Подтвердить что ты не робот

Является ли GOTO в PHP злым?

Недавно я узнал, что PHP 5.3 поддерживает новую конструкцию языка с именем GOTO. Все знают, что он делает. Однако это не совсем традиционный GOTO, это просто ярлык перехода. Мне интересно узнать, является ли этот GOTO злом и подразумевает плохой код?

4b9b3361

Ответ 1

Если вы не программируете на ассемблере, GOTO всегда следует рассматривать так же, как жилет для жизни самолетов: хорошо иметь их в наличии, но если вам нужно их использовать, это означает, что у вас большие проблемы.

Ответ 2

Я не могу поверить, что никто не опубликовал это:)

xkcd - goto

Конечно, PHP не скомпилирован... Может, хищник будет преследовать вас при каждом посещении вашего сайта?

Ответ 3

Плохая структуризация кода зла, независимо от используемой структуры управления.

Я лично предпочитаю goto, который очищает поток программы, чтобы "управлять переменными" и вложенным "if", что косвенно приведет к одной и той же ветки в коде.

Итак, просто напишите две версии (с GOTO и без них) и посмотрите, какой из них легче понять. Тогда выбор прост.

Ответ 4

Я в меньшинстве (в настоящее время), но я считаю, что ограничения, установленные на PHP goto, делают очень полезным:

http://adamjonrichardson.com/2012/02/06/long-live-the-goto-statement/

Я действительно просматриваю пример кода стрелки (глубоко вложенные условные выражения) и реорганизую его с помощью стандартных методов (предложения охраны, условия группировки, вытаскивание функций) в одной версии и версии на основе goto в другой версии, и я на самом деле предпочитают рефакторинг на основе goto.

Ответ 5

Я думаю, что это самая важная часть справочная страница PHP и отсутствует здесь:

Это не полный неограниченный переход. Целевая метка должна быть в том же файле и контексте, что означает, что вы не можете выпрыгнуть из функции или метода и не можете перейти в один. Вы также не можете переходить в какую-либо петлю или структуру коммутатора. Вы можете выскочить из них, и распространенное использование - использовать goto вместо многоуровневого разрыва.

ИМХО это очень сильно отличается от устаревших стилей BASIC.

Ответ 6

Являются ли орудия злыми? Оба могут быть использованы для добра или зла. Я бы сказал, что легче писать хороший код без goto, чем с.

Ответ 7

Любая функция языка, которая может сделать код более читаемым в данной ситуации, - это хорошая вещь. GOTO - одна из таких особенностей языка, даже если таких ситуаций мало и далеко. Если мы запретили какой-либо синтаксис, который позволил бы бедным программистам писать плохой, не поддающийся контролю код, наши задания были бы намного сложнее.

Ответ 8

Как программист, я в основном работаю над "мэйнфреймами" и "большими корпоративными серверами"... И наш ежедневный язык (я имею в виду один из 95% нашего базового кода) - Cobol, который широко использует GOTO.

Это использование не означает, что код плохой. Это просто означает, что этот инструмент (GOTO) был правильным в тот момент, когда были написаны программы.

Чтобы ответить на вопрос Kaitsuli, я думаю, что это может быть полезным инструментом при написании PHP-скриптов. С другой стороны, уже почти десять лет без него было достигнуто множество сценариев. Кроме того, это противоречит эволюции PHP с более объектно-ориентированными функциями.

ИМХО, это ни хорошая, ни плохая вещь для кода: хорошие программы по-прежнему будут хорошими, а "программы ужасов" будут хуже... Единственный вопрос: "Зачем добавлять GOTO через 10 лет после подтверждения того, что это было не нужно?".

Ответ 9

GOTO обычно злой, потому что он позволяет создавать неструктурированный код. С помощью обычных циклов вы можете легко построить хороший структурированный код, потому что он структурирован.

Когда у вас есть неструктурированный код, прыгающий отсюда туда, вы только что обнаружили зло, исходящее из инструкции GOTO. Почти всегда лучше избегать этого. Может быть, каждые 100 000 строк есть место, где предложение GOTO упрощает LOT, поэтому код не является злым, но если вы не уверены, вам следует избегать GOTO.

Надеюсь, что это поможет.

EDIT: Ну, просто чтобы добавить мое собственное мнение здесь, есть другие инструкции, которые позволяют вам создавать неструктурированный код и которые не считаются злыми, когда я думаю, что они должны быть.

Например, возвращение в середине функции является GOTO до конца, поэтому я избегаю их и использую только один возврат в каждой функции только в конце.

Другие языки, такие как Vb.Net(возможно, другие), позволяют делать Exit For, Exit While, breaks и т.д., которые также неструктурируют код, и я думаю, что этого следует избегать.

Ответ 10

иногда (я имею в виду в 0,01% случаев), это полезно, например, когда у вас длинный длинный script, и вы хотите протестировать некоторые блоки. но никогда не оставляйте его в своем последнем script

Ответ 11

Я использовал GOTO, когда пишу script для работы в режиме cli. Это спасает мою жизнь.

Ответ 12

GOTO следует удалить с языка. Если у кого-то есть необходимость "безоговорочно передать управление", тогда им нужно вернуться в школу, чтобы изучить Структурированное программирование 101