Нельзя использовать goto

Часто говорят, что goto плох. А собственно, почему?

В ассемблерном коде на машинном уровне все управляющие конструкции (if, while, for и другие) преобразуются в набор команд с безусловным переходом jmp (UPD: как правильно заметили, с безусловным или условным переходом, но по указанному адресу, то есть куда угодно). А такой переход — самый настоящий goto. То есть ты весь такой изящный во фраке пишешь циклы, а наглый компилятор/интерпретатор выкидывает всю красоту и делает goto.

Так почему же сам goto является признаком плохого кода, если он на самом деле везде?

Ответ кроется в умении сохранять контекст. Человек может в голове держать 5-9 сущностей, больше не получается. Поэтому придумали функции, и придумали держать их небольшими — для снижения когнитивной сложности. Конструкция if переведёт тебя в одну из веток ниже, циклы for и while выполнят тело цикла или выбросят за его пределы. Команда goto сложность привносит — прыжок может быть куда угодно. А повышение сложности всегда приводит к росту числа ошибок.

Ну а ещё из-за goto может напасть <a href="https://pikabu.ru/story/nelzya_ispolzovat_goto_12583316?u=https%3A%2F%2Fxkcd.ru%2F292%2F&t=%D0%B2%D0%B5%D0%BB%D0%BE%D1%86%D0%B8%D1%80%D0%B0%D0%BF%D1%82%D0%BE%D1%80&h=b4fb4e894ae317dbd4e6f8aa8ca1f5e1ef76eee2" title="https://xkcd.ru/292/" target="_blank" rel="nofollow noopener">велоцираптор</a>

Ну а ещё из-за goto может напасть велоцираптор

Лига программистов

2.3K постов12K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

1
Автор поста оценил этот комментарий

За последние 20 лет программирования ни одного goto кроме как в шеловских скриптах я не встречал.

В скриптах решающее значение в читаемости кода имеет название меток перехода.

goto :Errors

goto :Warnings

got :Exit

вполне читаемо


goto :A1

goto :DDD

нет

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Простите, закрыл гештальт юности и поделился наблюдением) тоже goto больше 10 лет не видел. А вот мемы встречал, в том числе комикс из сабжа

5
Аватар пользователя DELETED
DELETED
Автор поста оценил этот комментарий

В ассемблерном коде на машинном уровне все управляющие конструкции (if, while, for и другие) преобразуются в набор команд с безусловным переходом jmp.

Это не так.


Для данных инструкций генерируются команды условной передачи управления: JE, JNE, JA, JB, ...


Например, команда JE: если результат предыдущей операции равен нулю (флаг ZF=1), то происходит переход по указанному адресу, иначе переход не происходит и выполняется следующая по порядку команда.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Блин, по факту. Пытался сформулировать мысль, что всё сводится к передаче управления, наличие условия не отменяет сути goto-шного перехода на низком уровне. Спасибо за поправку

1
Автор поста оценил этот комментарий

Кхм, а у меня наоборот, дальше 16 бит не пошло =)))) Тем более защищенный режим.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

До сих пор хихикаю с легаси, что придумали 4 кольца защиты, а используют только 2))

2
Автор поста оценил этот комментарий

Тут много нюансов может быть. Как пример ограничение размера сегмента памяти. Размер подпрограммы. Частота обращения к ней. К примеру JMP и ALMP имеет разный размер и выполняется по разному. И да, я осознаю что это другое в отличии от команды CALL.

У вас подмена понятий, в командах вы путаетесь.

Я в свое время писал на асме исключительно для серии Intel X51, и достаточно хорошо набил руку, что Си мне как бы и не нужен был.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ещё в конце студенческих лет меня поглотил python, поэтому на низком уровне у меня весьма и весьма скромный опыт. А ассемблере вообще околонулевой, только разок патчил чужой код, чтобы собрать проект на 64-битной машине (регистры менял)

Прошу прощения за некорректное упрощение

показать ответы
1
Автор поста оценил этот комментарий

В сях и плюсах в принципе можно и лонгджампы делать. На практике такого не видел.

В плюсах гото обычно избегают, и если используют, то для выхода из вложенных циклов. В яве для этого специально есть labelled loops.

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Проблема goto как раз в том, что неаккуратное применение очень сильно потом затрудняет поддержку кода. Перейти к концу функции в случае ошибок как раз оправданное применение. Но сразу возникает соблазн не только так использовать, а в результате код сразу становится чудовищным

1
Автор поста оценил этот комментарий

Мне как то сказали что dynamic_cast зло

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Моих малых познаний в С++ не хватает по этому вопросу. Как вы сейчас считаете, когда dynamic_cast юзать оправданно?

показать ответы
0
146%
Автор поста оценил этот комментарий

по Томучто ты старый и непонимаеш

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Факт

0
Автор поста оценил этот комментарий

А чё. If написал говно then goto profile and ban

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Куда лучше инкапсулировать всё это дело в класс

if post.smells_shit()
....post.author.ban()

2
Автор поста оценил этот комментарий

Тот, кто говорит, что какая - либо конструкция это плохо, тот что?

Не умеет этим пользоваться.


Для всего есть своё место и своё предназначение.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Когда я больше 15 лет назад знакомился с программированием на Си, мне просто сказали, что goto зло. Я как-то принял на веру и забил. А потом как-то вернулся к вопросу, подумал и делюсь мнением, почему в "старой школе" не любили goto

показать ответы
0
Автор поста оценил этот комментарий

А что в жаве, питоне или сях, как в старом ассемблере, можно меток наставить и гоуту везде понаписать? Или это адаптация статьи по программированию из 80-х :-)

А вообще в современном мире, когда над кодом работает больше одного человека, "читаемость кода" - это наше всё. Поэтому времена когда 20 команд записывали в одну строку канули

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Нет, в python конструкции goto точно нет. В java вроде нет. В Си точно есть. Удивительно, но goto есть в PHP) на мой вкус, полезно знать чуток исторического экскурса для широты кругозора. Типа что bug - это реально жучок в ламповом компьютере как причина поломки)

А вообще фокус несколько в другом. Фактически, исключения в языке действуют схожим с goto образом в части размывания области, за которой нужно следить. Думаю, это стало одной из причин, почему в golang нет исключений) А в языках вроде python надо к обработке исключений подходить системно

показать ответы
2
Автор поста оценил этот комментарий

Как уже ранее сказали. С херов переход безусловный ? Есть множество команд условного перехода, даже на асме. И программер сам решает, нужно ли ему стек сохранять или нет (Push. Pop). Разве что надо смотреть, что бы стек не переполнился.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Угу, ошибся. Но что условный, что безусловный переход - это переход по адресу, то бишь goto

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества