На PHP пишу уже давно, но только сегодня узнал, что начиная с версии 5.3 этот язык начал поддерживать goto оператор. Я помню еще в 90-х годах, когда программировал под MS Dos уже среди программистов ходило правило - не использовать goto. Это зло, которое портит программы. С тех пор утекло уже много лет и я никогда не пользовался goto под Windows ни в одном языке программирование.
Удивило то, что этот оператор появился в PHP 5.3. Я бы понимал, если бы он появился в первых версиях, а в 5.3 его убрали, как настоящее зло, но наоборот... Неужели мир перевернулся и переходы по меткам стали добром?
Оператор goto в PHP выглядит следующим образом:
goto codemark; echo 'Этого вы никогда не увидите'; codemark: echo 'А вот это увидите';
Даже в процедурных языках программирования можно без проблем обходится без goto, а уж в объектных языках (а PHP уже давно поддерживает объекты), добавлять переходы по меткам не вижу смысла. Узнали о существовании goto? Забудьте. Не используйте это, а если используйте, то только в очень крайних случаях.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
Поэтому программы на Бейсике называют клубком из нитей и советуют начинать с Паскаля.
Помню ещё в институте, когда вталкивали турбо-паскаль говорили:
"Увижу у вас этот оператор - будете сами программу отлаживать" :)
Да, оператор goto был нужен только в бейсике. Как только появилось процедурное программирование, от него стали отказываться. В объектном языке он вообще на фиг не нужен.
На таких темах всё время вспоминается текст Ed Post'а
Не понимаю почему все так бесятся насчёт goto. Однажды у нас на работе возникла реальная ситуация, когда за счёт этого оператора читаемость кода функции увеличилась в стопицот раз. Пусть это и единичный случай, но всё же. Мне кажется, это чисто программистские понты.
Его критика - невнимательность программистов, которые "прыгают" настолько лихо, что "прыжком" пропускают инициализацию/объяление переменных/вызов конструкторов и т.д., из-за чего и происходит всевозможные утечки и ошибки доступа.
Всего не услидить, поэтому всё равно лучше больше чем в самых оправданных местах (выход из нескольких циклов, обработка ошибок и т.д.) его не использовать.
Ну а что бывает когда их пытаются использовать новички - вы сами понимаете что получается, поэтому в институтах и литературе его так не любят...
Пытался найти линк пруфа но не смог, видимо подтёрли новость увидев среднюю реакцию "толпы" на ввод оператора GOTO. Ну раз не нашел напишу так)
"With GOTO implementation PHP finaly becomes a real programming language. So far it was a childrens toy." Ну где то такая вот штука висела на сайте PHP от создателей в первые часы после опублекования новости.
Кстати Михаил а вы не слышали, вроде как GOTO ещё в яве и ряде других языков ввели примерно в тоже время?
В яве оператора goto нету. В этом году была первоапрельская шутка по этому поводу в блоге Joseph Darcy из Оракла.
Самое банальное улучшение кода - http://pastebin.com/5jvBMMtP. В той же Java из-за отсутствия goto для таких случаев придуман миханизм вида http://pastebin.com/XhfzxBis. Код, конечно, немного подутрирован, но должно быть понятно. Если аккуратно его использовать - и читаемость, и скорость выполнения кода повышается.
Макс, в этом примере абсолютно отсутсвует смысл. Я ни разу не сталкивался со случаем, где бы label-break в яве являлся полезной ф-цией. А кусок php-кода это вообще какой-то страшный сон архитектуры и поддержки кода.
К тому-же еще и не соглашусь насчёт скорости выполнения: в яве есть HotSpot, который не плохо оптимизирует код. Каждое вмешательство и поток программы это палка в колёсах оптимизации.
Конечно-же можно найти теоретические примеры, где чисто теоретически, откидываю весь здоровый смысл, и зыкрывая на что-нибудь глаза goto-оператор улучшать работу программы, но "теоретическим" людям нужно писать на машинах тюринга а не пытаться воплотить эти идеи в программировании на высших языках.
Пример, конечно, утрирован, на лично я сталкивался и не раз: матрицы, низкоуровенный парсинг, криптографические алгоритмы и т.д....
А надеятся только на оптимизатор кода - глупо. Оптимизаторы чаще как правило либо вообще разворачивают циклы, либо не трогают их вообще.
А почему бы не выносить код в отдельные методы? Твой метод на яве запросто разбивается на 3 разных метода, которые легче понимать, тестировать и т.д.
Я всё еще хотел бы увидить какой-нибудь конкретный пример, где goto или label-break's были бы уместны. Без конкретных примеров можно друг-друга в пустую пытаться переубедить.
Но не зависимо от примеров или дальнейшего хода обсуждений - у каждого есть право на своё мнение. Лично мне за один из твоих кодов на работе руки оторвут и засунут куда не надо.
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.