IMHO, если такая потребность возникает, значит задача недостаточно разобрана и структурирована. Что с goto, что без, код будет выглядеть как ужасное мессиво. Здесь goto будет просто маркером "я не справился, пристрелите меня". )))
я об этом и говорю. сам по себе GOTO ничего плохого не несет. плохо когда его неправильно или не к месту используют. вот и все.
Есть полезная практика: - если уровень вложенности {} превышает, например, 3, то вложенный код надо оформить в отдельную процедуру; - если количество строк в процедуре превышает, например, 50, то процедуру сто́ит разбить на две процедуры с понятной зоной ответственности. Конкретные цифры оговариваются в корпоративном code standard и они не догма, конечно. Но повод для review. Если этим правилам следовать, не возникнет потребности ни в GOTO, ни в пустых диспутах.
я не призываю везде использовать гото. я сам его использовал в коде может раз или два. и конечно можно было сделать и без него, но конца света не наступило, код пашет. я всего лишь говорю - что гото это еще одна возможность. чем больше возможностей дает ЯП - тем он более гибкий, а это гуд. если справляетесь без гото - отлично. если кому-то легче писать с ним - пофиг. меня лично это не пугает. мне что с ним копошиться , что с ворохом continue 2|break 3... монопенисуально.
Как же я люблю людей, декламирующих прописные истины с видом первооткрывателя. Всегда доставляет. http://www.vspu.ac.ru/~chul/dijkstra/goto/goto.htm Собсно, о первооткрывателях. Ни кто не говорит о том что goto нельзя использовать, просто если он есть в коде, то вы либо гений, либо криворукий. Первое, как показывает практика маловероятно )
romach +1, в теме немного из истории о goto. Использовался в ассемблере, в фортране, паскале. Количество строк не превышало , наверное, 1000 или 2000. И не так сложно было разобраться с "прыжками". На сегодня скрипты занимают куда больше 5000 строк, и все не уложится в одной голове И поэтому на сегодня, это плохая практика его применения
ну а чего тогда развели тут на пустом месте? раз всем все понятно. break и continue - добро goto - зло хотя break и continue это просто частные случаи goto. и чего гениального если в коде будет goto? что ты несешь то? я в школе на бейсике еще goto писал, как и многие тут. и ничего страшного. выигрывал олимпиады. боязнь гото - это все ограниченность людей. загоняют себя в какието рамки зачем-то. Есть в языке такая возможность, значит нужно кому-то. тебя забыли спросить)) тебе не кажется удивительным то что GOTO есть практически во ВСЕХ популярных ЯП. Зачем он там? Наверное создатели всех этих ЯП дауны, добавляют совершенно ненужную romach-у фишку. Добавлено спустя 10 минут 30 секунд: Это твоя личная, ничем не подкрепленная позиция. Goto добавили не так давно (с версии 5.3) - зачем? если он такой плохой и ненужный никому) Можешь привести тут Пруф на документацию или некую официальную позицию создателей PHP - где говорится о том что использовать GOTO - это плохая практика?
Гото это инструмент. Инструмент не диктует волю своему владельцу. Проблема с гото не в гото, а в головах людей, которые превращают код в макароны. Это можно делать не только через гото.
+1 Добавлено спустя 1 минуту 34 секунды: Хотя, иногда инструемент таки диктует волю владельцу. Пример: обладающий оружием подсознательно ищет повод его применить.
+1 Добавлено спустя 2 минуты 6 секунд: они намекают на вред его БЕЗДУМНОГО использования. прочти что написано на картинках.
http://www.youtube.com/watch?v=BkvVDNS-Ibg p.s. Эта картинка достойна любой темы, которая длиннее одной страницы. Добавлено спустя 24 минуты 4 секунды: Если думаешь о ноже, как об оружии — то да, твои ножи заждались.
И много примеров осмысленного и необходимого его применения, по причине невозможности иначе создать вменяемую архитектуру, в высокоуровневых языках? goto точно такой же маркер, как распухший метод. Можно считать себя богом программирования и думать что всё нормально, а можно взять и переписать ибо с большой вероятностью это говнокод.
а почему вообще нужно делать ИНАЧЕ? ну встретился Goto и фиг с ним. почему непременно нужно сразу начать переписывать код и думать как его лучше оптимизировать? это же бред. ты же не начинаешь везде в коде менять switсh на IF? или наоборот. вот пример кода. что в нем ТАКОГО ПЛОХОГО, кроме нескольких лишних байт? Зато какая наглядность! Код (PHP): for($i;;) { //... if (isTrueJ($j)) goto F1; } //... } F1:
Ты про "осмысленно и необходимо" читал? Плохо то, что обычно пользуются другой конструкцией, соответственно сначала придется вникать в твой полет фантазии. И где тут к чертям наглядность? Наглядность - это когда подход прозрачен, общепринят и не меняется в зависимости от настроения.
Как раз в этом и трудности. Не всегда код именно повторяющийся. А неповторяющийся код в процедуры выносить - это хорошая практика? Спасибо за каноничный ответ топику! Попробую такую практику. Хотя на хабре данный подход не все одобрили, как всегда именно из-за неканоничного использования оператора цикла. Не все согласятся ибо в процедуры заворачивают повторяющиеся фрагменты кода. Тут вопрос в том, можно ли выделить законченую сущность в участке кода. Помоему хуже goto только break N. Это реальный усложнённый код goto. Конкретно тут - не клёво! Ошибка для всех одна. Респект за смелость! Именно так и есть! Опять цитаты из псевдо "книжек"! Реально понимаешь о чём речь?! Откуда на PHP 5000 строк. Или ты из файла в файл можешь прыгать используя goto? Выше человек правильно сказал, что надо разбивать процедуры от 50+ строк. Это касается и модулей\методов, вообще самостоятельных кусков кода.. Ты же весь PHP код в одном файле не пишешь. Тогда, как раз твоя реплика поддерживает использование goto в частных случаях в php. Ну, как я говорил про твой цитатный стиль, ты просто вызубрил, что goto, а сути не понял. Это тождественно - Говоришь! Код может быть распухшим только из-за монотонности, например перебор значений. (по сути это и тема топика, когда либо в простыню, либо во вложенность). Если начнёшь уходить от монотонности в циклы, можешь раздуть код в ширь по вложенности - палка о 2х концах. Не надо делать однозначных выводов. romach ты где-то мне советовал шерстить по документации.. Так вот, я как раз найдя в доке goto, и то, что он появился в 5.3 как раз и задумался, что кому-то явно не хватило этого инструмента в ранних версиях.
вот видишь, ничего конкретного, плохого ты сказать не можешь. все твои претензии сводятся к тому что - "Я так не пишу - значит и ты не должен". это не аргумент
Ну так self-documenting же ) Если название будет кратко описывать, что там происходит, то почему нет? Особенно актуально с большим куском кода. Разбиваешь на отдельные части, внятно называешь и в итоге по прошествии пары месяцев понимаешь что, где и заодно общую логику происходящего. Неа, вроде не я. Я бы посоветовал взять один из популярных фреймворков и заняться написанием кода, вместо обертки над ним ) Добавлено спустя 2 минуты 6 секунд: Ну почему же? Ещё Дейкстра так не писал. Хотя, кто он вообще такой? Наверное очередной хипстер со смузи и завышенной самооценкой )
Тогда надо будет учить ещё и фреймворк! Я в php ещё очень слаб. Хочется сделать пару проектов с нуля, чтобы понять особенности и трудности синтаксиса, внутренней реализации, популярных шаблонов.. 1) Пока раздражает, что строка - скаляр. Надо всё оборачивать неизведанными по историческим именам функциями, которые надо искать в доке + у которых разные наборы и последовательности параметров. Еслиб строка была обьектом, то было бы на порядок шустрее. 2) На сервере, куда релизить стоит софт под php 5. Надо ограничиваться им.
Наверное goto ввели в PHP потому что кто-то об этом просил. Это говорит только о том, что пыха должна обеспечивать легкое вхождение для не умеющих программировать. Больше ни о чём.
ну наконец-то нагуглил название его статьи) да вот только похоже ты её не читал даже. ибо он там ставит под сомнение любые go to. т.е. получается что и break зло и continue. и даже: и даже использование процедур: пропадает "единственность текстуального индекса". Добавить сюда можно еще то, что статья эта написана им в 1968 году, т.е. почти 50 лет назад. С тех пор многое изменилось, и даже в теории программирования, нельзя это не признать. Добавлено спустя 3 минуты 52 секунды: goto есть в Фортран, Алгол, Кобол, Бейсик, Си и C++, C#, D, Паскаль, Perl, Ада, PHP .... даже в Java есть метки перехода. это всё ввели тоже наверное для "легкого вхождения для не умеющих программировать. Больше ни о чём." ) Добавлено спустя 5 минут 25 секунд: Линус, опять же, одобряет )
Веб-фреймворк, он и в Африке веб-фреймворк, даже если это express.js или какой-нибудь martini, общие принципы везде одни и те же. runcore, да юзай ты своё goto. Мне с тобой, к счастью, над одним проектом не работать.
Плохо то, что надо искать эту метку, где она там, блин. Стоял бы бряк, сразу было бы ясно, ага, это условие схлопывает цикл. break, continue - это семантически удобные операторы, скажем так. Если юзать так, как ты постоянно говоришь, то гоуту не нужен, потому что есть вышеописанные ребятки. В противном случае, с помощью гоуту можно намакаронить макароны даже в 20 строчках. Его беда в том, что это не цикло-ориентированный оператор. Это оператор, который может оторвать логику кода от его структуры. Есть блок кода, но он выполняется по хитровыбоенной диагонали с зигзагами, а не сверху вниз. Вот потому и говорят, что гоуту - плохо. Человек, привыкающий его юзать, может скатиться на раз.
Короче, единственная проблема в goto - это читабельность кода. Особенно если использовать множество меток по коду. Выходы типа return, exit .. тот же гото. Это если кто-то хочет разобраться, а не тупо цитировать чужие слова. Для меня важен способ рефакторинга множества ветвлений при получении внешних данных, где надо сначала понять получили ли мы вообще переменную, проверить на соответствие её данных шаблону, обработать и выдать сообщения об ошибках или успехе. Как правило, затыки у меня только тут в случае POST GET данных. Затыки в плане громозкости ветвлений. Если это можно как-то заменить try catch, то хорошо.