sorry_i_noob
@sorry_i_noob

Я слышал, что goto использовать НЕЖЕЛАТЕЛЬНО. А что насчет while(true)? В функции есть много if'ов, в которых есть return. Моветон ли while(true)?

Здравствуйте. Я слышал, что goto использовать НЕЖЕЛАТЕЛЬНО. А что насчет while(true)? В моей функции (внутри while(true)) есть if'ы, в которых return. Моветон ли while(true) в таком случае? Да и вообще моветон ли?
  • Вопрос задан
  • 739 просмотров
Пригласить эксперта
Ответы на вопрос 7
longclaps
@longclaps
Слышал звон )))
Мне вот почему-то кажется, что выход из языковой конструкции (цикла, или функции, и тд) в объемлющий её код не создаёт никаких затруднений.
А вот впрыгивание внутрь такой конструкции, на произвольную строку черевато.
Попробуй самостоятельно подумать эту мысль, а не получится - просто запомни её )
Ответ написан
Комментировать
customtema
@customtema
arint.ru
Пример конкретный покажите. И на каком ЯП, в какой среде.

while(true) и все, что вы описываете, нормально для систем реального времени. И очень плохо для веб-приложений и т.п.
Ответ написан
makarenya
@makarenya
программист
Последний раз я использовал GOTO в QBasic (можете погуглить). Это был для меня первый язык программирования, а сам я учился в школе, и даже не в старших классах. Без него можно обойтись вообще всегда, хотя иногда это и не так уж и удобно. Но я видел неоднократно его использование в серьёзных проектах. Почти всегда он один единственный на несколько десятков файлов с кодом.

Отказ от GOTO является одним из принципов структурного программирования. А ещё один его принцип - это единая точка выхода для любой конструкции. По сути - это отказ от return за исключеним случая, когда нужно вернуть какое-то значение в самом конце функции, а ещё и отказ от continue или break в циклах. И... вот так уже не делали ни в одной компании, где мне довелось работать, ни в одном opensource проекте, код которого мне доводилось смотреть.

Причина, почему один принцип заучивается на зубок всеми программистами, а второй представляет из себя лишь повод посмеяться - это их цена. Программа, богатая на goto, очень быстро становиться нечитаемой, непредсказуемой и неподдерживаемой. Понять - что в ней происходит, становиться невозможно уже после пары сотен строк. А вот с return из середины функции, как и с break из середины цикла - цена невысока. Ими уже так просто программу в трэш не превратить. Читаемость и поддерживаемость не падает, в том числе, и при использовании бесконечных циклов. А в некоторых случаях без них никуда. К примеру, любая программа для микроконтроллера представляет из себя бесконечный цикл и без любой возможности выйти из него.

Так что часто бесконечный цикл является возможностью сделать программу проще, и не дублировать строки кода лишний раз - то есть упростить понимание и поддерживаемость программы, а это куда как важнее слепому следованию старым принципам. С другой стороны - если вы используете бесконечные циклы едва ли не так часто, как и все остальные - то тут уже начинает появляться вопрос - достаточно ли вы хорошо ознакомлены с циклами в том языке, на котором вы пишите. Ведь очень часто даже самые нетривиальные конструкции и фичи решаются с помощью цикла for - он в данном случае крайне мощный (если разговор о c/c++/c#/...)

PS. Выход из кучи вложенных циклов при помощи return из функции - самый простой способ ухода от необходимости в GOTO и одновременно отказа от оверхеда на лишние и ненужные условия. Используется всеми и "на ура"
Ответ написан
Комментировать
mindtester
@mindtester
https://youtu.be/UtO6HIp1908?list=RDUtO6HIp1908
1 - моветон
2 - другой вопрос, что иногда это классное решение (когда сокращает количество строк кода... до одной или двух)

... если строк кода больше 2х - вы роете себе яму... может все будет работать хорошо... а может вам придется провести много времени в отладчике... при чем далеко не сразу может появится стечение обстоятельств, которое все рушит

ps это вопрос читаемости/понимаемости кода. когда строк 2-3 - читаемость легкая
Ответ написан
ApeCoder
@ApeCoder
по while(true) не понятно какое именно условие выхода из цикла. То есть очевидно что цикл когда-то заканчивается но условие выхода размазано по его телу. Так же если происходит выход из цикла тоже трудно его понимать как черный ящик - т.е. дописывание, например, в конец фнукции какого-то кода не гарантирует его выполнения.
Ответ написан
Комментировать
@Doc44
while(true) - это нормально.
если аналог с условием - читается гораздо хуже.

а вот если вы суете while(true) везде где только можно - это плохо.
Ответ написан
Комментировать
@pqgg7nwkd4
Мне как-то нужно было реализовать сложный алгоритм представленный в виде блок схемы из документации. И я использовал goto, и мне было всё-равно что это моветон, переводить это в циклы не было никакого желания. А в повседневности мне не приходит в голову его использовать.
while(true) тоже достаточно удобная конструкция, т.к. ее блок можно повторить или выйти из него в любой момент. Удобно, например, делать проверку параметров функции. Мне кажется, что в языках не хватает конструкции для этого.
Автор, можно так сказать: можно и с goto и без писать код и хорошо и плохо. Не над тем вы паритесь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы