За последние 24 часа нас посетили 59219 программистов и 1830 роботов. Сейчас ищут 853 программиста ...

Оператор goto

Тема в разделе "Прочее", создана пользователем Donald, 13 окт 2015.

  1. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    В php вообще проблемы с этим, наследие тяжких времен ) Потому и создаются обертки над массивами, строками и прочим, т.к. улучшений в этом плане не предвидится.
    5.3 уже не поддерживается, не надо его использовать ) А на >=5.4 можно найти всё что нужно.

    Добавлено спустя 2 минуты 19 секунд:
    А зачем вообще нужно ветвление? У нас есть массив входящих данных и массив правил к ним, нужно просто их сопоставить и вывалить ошибки, либо идти дальше.
     
  2. Donald

    Donald Новичок

    С нами с:
    13 окт 2015
    Сообщения:
    31
    Симпатии:
    0
    Есть пример?
     
  3. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    это не сложнее чем поиск функции/класса, описанной вообще в другом файле. а ведь это повседневная рутинная операция, при разборе легаси кода. А нормальная IDE вообще по клику к метке перекинет, вы что все в Блокноте программируете? )
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    https://github.com/Respect/Validation/tree/master/docs
    Код (PHP):
    1. try {
    2.     Validator::key('username', Validator::length(2, 32))
    3.              ->key('birthdate', Validator::date())
    4.              ->key('password', Validator::notEmpty())
    5.              ->key('email', Validator::email())
    6.              ->assert($input);
    7. } catch (NestedValidationExceptionInterface $e) {
    8.     print_r($e->getMessages());
    9. }
    В требованиях указано >=5.3.6
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну это я приписал просто дабы пометить место. Сообщения которые выше как раз должны идти в ошибку, которая юзеру покажется. Просто это уже у каждого свой способо, как ошибки отображать.

    Добавлено спустя 1 минуту 39 секунд:
    вообще-то да. Это единственная проблема изначально. Странно, что ты пришел к этому выводу после беседы.

    Добавлено спустя 37 секунд:
    нет, с ними прогнозируемая ситуация - раз. Два, их легко найти и даже IDE легко с ними работает.
     
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    это не беда, это его особенность. ибо для описания алгоритмов нужны не только циклы, есть и нелинейная логика, автоматы... тут гото по сути, единственный внятный инструмент.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну я заменил и живу счастливо. В подавляющем большинстве случаев исключение не вызывается, так что код работает быстро.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    изначально в PHP goto не было, об этом речь. зачем добавлять то, без чего нормально обходились? а затем, что… ну ты в курсе.
    продолжай острить и сравнивать пыху с фортраном )

    Добавлено спустя 6 минут 27 секунд:
    "goto" в списке зарезервированных слов Java с пометкой "not used". метки перехода всего лишь заменяют N в break N. что лишний раз доказывает роль goto )))
     
  9. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    А все читали доку по goto, да? Там вообще-то написано, зачем ввели goto, основной случай его использования.
    Другое дело, что есть и другие способы этого добиться, но у них тоже есть свои проблемы. Особо когда правится уже существующий код.
    По-этому, в 90% случаев даже по указанному случаю - это будет инструмент быстрого изменения кода. Инструмент "последнего шанса". А значит, что бы его правильно применить - нужна очень хорошая квалификация.
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    процитируй пожалуйста оттуда зачем ввели goto.
     
  11. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ну если осилить абзац не получается самим, то пожалуйста.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    а где же вот это: "А все читали доку по goto, да? Там вообще-то написано, зачем ввели goto"? [ выделено мной ]
    [​IMG]
    я перечитал еще раз и не нашел зачем. тем более там нет про "90%" и про "инструмент последнего шанса". а в твоём сообщении выглядит именно так, якобы это в офф.документации написано.

    конечно, обычно goto используется вместо break, о чем и трендим в предыдущих 2 страницах. но ты посчитал нужным "натыкать всех носом". ай-ай-ай!
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    зачем вы вообще это обсуждаете, если в жизни этой проблемы по факту нет?
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    100% флейм
    пожалуй теме место в "Беседы" )
     
  15. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ты пробуй читать и вчитываться в то, что люди пишут. А не по диагонали. И не будет "выглядеть".
    Ну давай, детка, покажи мне пальчиком, где ты писал, что goto для того, что бы избежать break 10.

    Добавлено спустя 2 минуты 29 секунд:
    Выепнутся хотят.
    Хотя по факту тут самый вменяемый оказался топикстартер, несущий на 99% ахинею. А вот 1% про goto внезапно попал: "Помоему хуже goto только break N. Это реальный усложнённый код goto."
    Ибо break 3 - это реально ад, и по читаемости, и по устойчивости к рефакторингу.
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Детка, ты мой ровестник, только у меня нет такого распухшего ЧСВ. Обычно я предваряю своё мнение оборотом "IMHO," или "Мне кажется, что", а не утверждаю что так сказал Заратустра.

    А вот моя цитата, которую ты попросил:
    Слово "break" 14 раз упоминается на первой странице темы и 11 раз на второй :)
     
  17. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Заменяется константой.
     
  18. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    С перлом не путаете?

    Добавлено спустя 1 минуту 13 секунд:
    Эта цитата несет прямо противоположный смысл.
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Противоположный чему?
    Мне кажется, что фраза "common use is to use a goto in place of break" лучше всего переводится как "обычно goto используется вместо break", не?
    Ну дай свою версию. Противоположную, LOL )))
     
  20. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Не путаю. А почему Perl?

    Добавлено спустя 5 минут 30 секунд:
    Ну раз забыл "multi-level", то всё наоборот :)
     
  21. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Там есть конструкция last LABEL;
    И этим лейблом можно отмаркировать нужный блок.
    В PHP тупо число вложенных блоков, как тут константа то поможет? Тем более, вроде выражения в break запретили уже.

    Добавлено спустя 2 минуты 9 секунд:
    "обычным применением оператора goto является использование его вместо многоуровневых break"
    "Обычно goto стоит там, где больше уместен break или return"

    Совсем одинаковый смысл, угу.
     
  22. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Не, всё проще. Я о том, что в выражении "break N" N - это константа. Константы можно определить в начале кода как
    define('BREAK_ON_BAD_FORMAT', 1);
    или
    const BREAK_ON_BAD_FORMAT = 1; в классе
    Соответственно "break 1" будет выглядеть как "break BREAK_ON_BAD_FORMAT", что вполне удобочитаемо, хорошо определяется в IDE и подсвечивается.
     
  23. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Проблема плохой читаемости не в этом. В конце концов можно написать break 1; // BREAK_ON_BAD_FORMAT
    Ибо ваша версия не работает
    Код (Text):
    1. $ php -r ' define("NNN", 2); while(true) { while(true) { break NNN; }}; '
    2. PHP Fatal error:  'break' operator with non-constant operand is no longer supported in Command line code on line 1
    Проблема - понять, куда именно мы выходим. Это очень плохо читается, если циклы достаточно объемны по коду. Вторая проблема - при рефакторинге, не дай бог, потребуется еще один цикл добавить, нужно не забыть увеличить это число. И IDE не поможет, ибо на самом деле IDE не может знать - нужно нам выходить из нового цикла тоже, или оставаться в нем.
     
  24. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ок-ок. Потому я за функции и коды возврата с помощью return. А goto как крайняя мера, как заплатка для выхода именно из глубокой..

    Добавлено спустя 3 минуты 26 секунд:
    Donald, тебя уже три раза минимум попросили предоставить более сложный код, с которым ты столкнулся.
     
  25. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ну в общем да, что-то такое я и сказал. В первую очередь инструмент работы с существующим кодом, когда провести рефакторинг нет возможности. Ну и прочие исключения.
    Есть и красивее способы, например
    Код (Text):
    1. $flag = true;
    2. for($i=0; $i<100 && $flag; $i++) {
    3.    for($n=0; $n<100 && $flag; $i++) {
    4.       for($x=0; $x<100 && $flag; $x++) {
    5.           echo $x;
    6.           $flag = false;
    7.       }
    8.    }
    9. }
    но тоже не всегда подходят.