Имя пользователя:

Пароль:


Список форумов ПРАКТИЧЕСКИЕ ВОПРОСЫ Работа Программирование и IT Просмотров: 937

Абсолютное ли зло "goto"?


Давим клаву за бабло
  #1
Сообщение 29 Dec 2013, 14:10
Ursego Аватара пользователя
СОЗДАТЕЛЬ ТЕМЫ
Canada, Ontario
Город: Toronto
Стаж: 11 лет 7 месяцев 25 дней
Постов: 10707
Лайкнули: 3448 раз
Карма: 33%
СССР: Днепропетровск
Пол: М
Лучше обращаться на: ты
Заход: 20 Nov 2023, 18:00

cthulchu (ЗДЕСЬ):
что-то типа гоуту
Не надо этого бояться. break и даже иксепшены - тоже родственники goto, и ничего. Когда-то, много лет назад, когда программисты мира (ага, все 30 человек :_lol1_: ) переходили с ассемблера на языки 3-го поколения, шла борьба со старыми привычками (если ты имел дело с ассемблером, то знаешь, что там программа прыгает с места на места как блоха: если то-то, то jump туда-то...), причём одной из самых крепко засевших была привычка юзать goto там, где можно написать if ... else - с ней и развернулась главная борьба, отголоски которой встречаются в книгах до сих пор - мол, напишешь goto и черти сразу зажарят тебя на сковороде. При этом ни словом не упоминается, что вполне может возникнуть ситуация, когда употребление этого нецензурного слова очень даже оправдано даже в эпоху айфонов.

  #2     Абсолютное ли зло "goto"?
Сообщение 29 Dec 2013, 14:21
Cth Аватара пользователя
Canada, British Columbia
Город: Vancouver
Стаж: 10 лет 3 месяца 25 дней
Постов: 1550
Лайкнули: 312 раз
Карма: 21%
Пол: М
Заход: 09 Aug 2022, 19:36

ну дело в том, что после компиляции код с гоуту не будет особо (а может и совсем) отличаться от кода без гоуту. все верно, на асме джампы будут юзаться, в любом случае. и препод по асму нам говорила, что джампы мы можем использовать в асме, ибо без него не получится сделать циклы. собственно, мы все циклы джампами и делали. тогда в чем прикол запрещать гоуту в более высокоуровневом программировании? всюду в других языках нам строго запрещалось его использовать, на равне с брейком.

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

ЗЫ

но по моему, мы не в той теме обсуждаем брейки и гоутушки.

  #3     Абсолютное ли зло "goto"?
Сообщение 29 Dec 2013, 14:36
Ursego Аватара пользователя
СОЗДАТЕЛЬ ТЕМЫ
Canada, Ontario
Город: Toronto
Стаж: 11 лет 7 месяцев 25 дней
Постов: 10707
Лайкнули: 3448 раз
Карма: 33%
СССР: Днепропетровск
Пол: М
Лучше обращаться на: ты
Заход: 20 Nov 2023, 18:00

Уже в той! :mrgreen:

Вспомнил как на одной фирме, где я работал, была утилита, выискивающая goto в коде! :_vot_chert_:

  #4     Абсолютное ли зло "goto"?
Сообщение 29 Dec 2013, 14:54
Cth Аватара пользователя
Canada, British Columbia
Город: Vancouver
Стаж: 10 лет 3 месяца 25 дней
Постов: 1550
Лайкнули: 312 раз
Карма: 21%
Пол: М
Заход: 09 Aug 2022, 19:36

ахахахахах, а ctrl+F - не утилита? :) а как на счет тотлавского волшебного ctrl+alt+F7? эта утилита найдет что угодно где угодно, ею даже по бинарникам сигнатуры можно рекурсивно искать. При этом, читая их в разных кодировках. По моему, там их даже хексом можно читать :)

Но, все же, видимо, гоуту - нехорошо, если кто-то его ищет.

  #5     Абсолютное ли зло "goto"?
Сообщение 29 Dec 2013, 20:35
Canada, Ontario
Город: Toronto
Стаж: 11 лет 7 месяцев 18 дней
Постов: 745
Лайкнули: 58 раз
Карма: 8%
Пол: М
Заход: 16 Jan 2021, 17:50
При этом ни словом не упоминается, что вполне может возникнуть ситуация, когда употребление этого нецензурного слова очень даже оправдано даже в эпоху айфонов.
И какая же это ситуация?
Без goto можно обойтись всегда

  #6     Абсолютное ли зло "goto"?
Сообщение 29 Dec 2013, 21:50
Ursego Аватара пользователя
СОЗДАТЕЛЬ ТЕМЫ
Canada, Ontario
Город: Toronto
Стаж: 11 лет 7 месяцев 25 дней
Постов: 10707
Лайкнули: 3448 раз
Карма: 33%
СССР: Днепропетровск
Пол: М
Лучше обращаться на: ты
Заход: 20 Nov 2023, 18:00

И какая же это ситуация?
Помнится, в старом PowerBuilder-е (до появления exceptions - кажется, в 7 версии) мы писали функции, производящие валидацию данных перед отправкой на сервер, следующим образом:

// ...do something...
if ... then goto problem_found

// ...do something...
if ... then goto problem_found

return 1

problem_found:

MessageBox(.........)

return -1

Что КОНКРЕТНО там плохо? :_pozhimanie_plechami_:

Без goto можно обойтись всегда
А я обратного и не утверждал! Например, ту-же функцию можно написать следующим образом (некоторые так и писали), да только я сомневаюсь, что это более элегантный способ (чтоб не сказать жёстче):

boolean lb_ok = false

do
   // ...do something...
   if ... then exit

   // ...do something...
   if ... then exit

   lb_ok = true
while false

if not lb_ok then
   MessageBox(.........)
   return -1
end if

return 1

Уродливо, но зато без ненавистного матюка!

  #7     Абсолютное ли зло "goto"?
Сообщение 30 Dec 2013, 14:57
Canada, Ontario
Город: Ottawa
Стаж: 11 лет 6 месяцев 2 дня
Постов: 164
Лайкнули: 15 раз
Карма: 10%
Пол: Ж
Заход: 05 Jan 2017, 21:38
Я вздрагиваю, когда вижу goto. Пришлось в свое время переписывать программы написанные 20-ть лет назад.
"и это пройдет" (c)

  #8     Абсолютное ли зло "goto"?
Сообщение 30 Dec 2013, 20:57
Cth Аватара пользователя
Canada, British Columbia
Город: Vancouver
Стаж: 10 лет 3 месяца 25 дней
Постов: 1550
Лайкнули: 312 раз
Карма: 21%
Пол: М
Заход: 09 Aug 2022, 19:36

в общем, это не только у меня гоуту глаз режет, и это при том, что я свой универ закончил пару лет назад, тобишь, студентов в политехах все еще этому учат.
Уродливо, но зато без ненавистного матюка!

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

Вам есть что сказать по этой теме? Зарегистрируйтесь, и сможете оставлять комментарии