Нельзя использовать 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 может напасть велоцираптор

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

2K поста11.9K подписчиков

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

goto :Errors

goto :Warnings

got :Exit

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


goto :A1

goto :DDD

нет

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

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

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку