Много разговоров ходит вокруг безусловного перехода: мол, "не по-пацански это, использовать его", "всегда можно обойтись без него" и т.д…=) И тем не менее, в некоторых ситуациях это практически единственный вариант… например: выход сразу из нескольких вложенных циклов. Хотелось бы услышать мнения, по вашему опыту ухудшает ли производительность использование GoTo?
22 ноября 2008 в 9:01
лично я всегда стараюсь писать без goto. но не всегда удается. но не удается не потому что нет другого способа, а потому что влом расписывать ветки if/else
21 ноября 2008 в 23:05
незамарачиваитесь на том что юзать goto ни в коем случае нельзя, если ваш компилятор его поддерживает то невижу никаких препятствии.
только
1) нестоит им пользоваться очень часто, поскольку это деиствительно запутывает, усложняет чтение…
2) непрыгать куда попало(между функцими например… если даже компилятор и поддерживает, то это просто ужасно). желательно чтобы метка и goto находились на одном экране…
3) в некоторых языках есть другие аналоги безусловному переходу типа break и continue, их использование более логично, если есть возможность то конечно лучше использовать их вместо goto.
ps всегда обхожусь без goto, хотя и у меня нет предрассудков по этому поводу, и я знаю что в некоторых случаях код получается более компактным и наглядным(можно даже сказать логичным)
pss если в хелпе по языку не написано что нибудь типа "goto – оставлен для совместимости с предыдущими версими…" то все ОК
19 ноября 2008 в 16:01
Думаю что про хвостатую рекурсию все знают мо я даже при её рреализации на делфах идина ниразу не использооовал так что это не аргумент.
19 ноября 2008 в 2:03
К тем кто говорит "путает с скомпилированной версией", то есть для тех до кого туго доходит, объясню, что я привел всего лишь пример как исполняется код в скомпилированном виде. Те кто говорит про различия между jmp и goto, что с ними говорить, для них семантика важнее чем принцип. Выше я не говорил что нужно использовать оператор goto повсюдно, можно лишь в редких исключениях. Мой аргумент был хвостовая рекурсия, а не скомпилированный код. Кто не знает что это такое,тот только и может сказать что jmp это не goto.
19 ноября 2008 в 0:00
GoTo переводиться как идти на …. или идти в …. или идти к ….
Однозначно против использования такого злобного оператора.
18 ноября 2008 в 22:03
Кхм… Позвольте вставить и свои три копейки.
Да бытовало и дытует (может и по инерции) мнение что goto – это плохо.
Пример с циклами приведенный в начале топика действительно не самый лучший, но это для Си и ко.
Мое же мнение нужно его избегать. НО действительно существуют конструкции когда без него не обойтись. Как самый простой пример какая-то из сортировок его использовала (текст не сохранился) отправлю читать Кнута.
Далее народ, думаю что asm тут еще помнят, и думаю помнят как организуется обыкновенный цикл на нем.
если flaga то иди туда
если ax = 15 то иди сюда
и т.д.
Так что как таковой goto есть и без него не обойтись.
18 ноября 2008 в 21:05
не понимаю, чем goto может существенно мешать оптимизации, кроме как создавая одну-единственную связь в графе исполнения (возможно с условием).
внесение одной связи в граф, честно говоря, позволяет добиться лучшего результата, чем добавление множества костылей (случай проверки флага необходимости выхода из цикла). я согласен в том, что недостаток этого способа – в неудобоваримости для человека. оптимизирующему компилятору (при правильной организации программы) должно быть безразлично – он ваш флаг превратит в goto из вложенных циклов. зато если компилятор не достаточно хитер (и программа написана "правильно"), то goto работает быстрее.
18 ноября 2008 в 21:03
Причём мои слова подкреплены чёткой, красивой, элегантной, математически строго доказанной теорией по данному поводу.
18 ноября 2008 в 21:02
GoTo очень затрудняет чтение программ, а к этому надо стремится…
Можно все цыклы добавить в фкнкцию и выходить сразу из функции, как зависит на чем пишешь и с условием в цикле тоже отлицная идея…
18 ноября 2008 в 21:01
Не нада путать компилированную версию с исходным кодом. Я сомневаюсь что кто то в её ползает. То что делает компилятор с исходниками это совсем другая история. Да и какие компилиррованные фрагменты ты имеешь в виду? Нормальные компиляторы дают на выходе исполняемый машинный код. Если же ты про результат компиляции интерпритат (что нить типа пи кода) то эт совсем другая тема. Да и такие промежуточные коды нужны тока машине и она их подготавливает как ей угодно. Оставим это на совести разработчиков компилятора. А для анализа нормальных исходников goto кривой оператор.
18 ноября 2008 в 21:01
Нет и не может существовать нормальных веских доводов в пользу идина! Да и реальной пользы кроме гемора и лени от него никакой нет!
18 ноября 2008 в 21:00
Никто сейчас не говорит про уже скомпилированный код. Я вынужден уже второй раз обращаться внимание, что на низком уровне нету ничего кроме ассемблерного jmp. Сейчас идет разговор о коде более-менее высокого уровня т.е. хотя бы Си. Там goto неприемлем. Goto в высокоуровневом коде – признак лени. Goto не ускоряет исполнение программы, а только затрудняет компилятору работу по оптимизации. В большинстве случаев программы с goto работают медленнее, чем без них. Я не знаю, какие доводы можно привести за goto, в чем его реальная польза?
18 ноября 2008 в 20:05
Есть случаи когда использование Goto уместно, например хвостовая рекурсия. Так что не надо говорить что оператор умер. Также, компилированная версия любого существенного фрагмента программного кода содержит сотни операторов Goto.
18 ноября 2008 в 16:05
goto – бессмертен, и не надо считать чуваков из //www.zaebalo.com
галимыми.
goto не умрёт.
18 ноября 2008 в 15:02
Так что неодного весомого аргумента в ползу ИДИНА я для себя такне обноружил а посему ему давно поставлен вердикт ДОЛЖЕН УМЕРЕТЬ!!!!!
18 ноября 2008 в 15:01
Чем бейсик не угодил незнаю. Просто его ненавижу. Видимо сказываеться старая память. Хотя на спектруме в своё время на нём прикольные вещи писал. Но я вообще ненавижу разного рода интерпретаторы. И не нада дальше реплик что VB это не интерпретатор. Он таким былостался просо название поменялось на более красивое а суть и подход прежний. Вообще концепция средств разработки от мелкомягкого почему то заточена под интерпретаторы (как бы они это та не называли).А коменты тоже не всегда спасают да и их избыток начинает больше вредить чем помоогать загромождая код.
18 ноября 2008 в 11:05
№46
и возле бреков и континусов советую писать, шо дальше произойдётЪЪЪ
// ИМХО
18 ноября 2008 в 1:02
#42
Я когда пишу код, то пишу к нему коменты, чтобы не забыть и чтобы через некоторое время было проще разобраться…
#43
Чем вам всем бэйсик то неугодил? 0_о нормальный язык…
18 ноября 2008 в 0:05
#43, Алексей Орлов
кстати, по поводу бейсика: в vb6 (и предыдущих) обработка ошибок либо построчная, либо goto (в соответствии с концепцией один вход – один выход).
ЗЫ: еще Марк Твен подметил, что "go to" уже в шестом веке использовался в качестве насмешки.
17 ноября 2008 в 22:03
#37 респект!!!
17 ноября 2008 в 22:02
#25 я НЕНАВИЖУ бейсик но иногда приходиться на нём писат (курсач кому нить наклепать, репетиторство и т.д. и т.п.) и в нём (даже в старых версиях) я всегда с лёгкоостью обхожуть без ИДИНА… без усложнения кода и неплохой читаемости а для новичков как элемент синтаксиса он полюбому должен обясняться чтоб они могли читать чужие коды и не чесать репу типа чё за нах за такой. Но если человек его использует он для меня просто мега лузер (хотя я и сам не профессионал). #29 и #42 полностью с вами согласен. Во как в кайф сидеть и ломать мозг даже через месяц над тем как этот кусок кода работал. Зачастую даже коменты не помогают. Тем паче если в погине 4000-5000 тысяч строк кода (бывает такое извращение когданезя использовать библиотеки да и с разбивкой на модули париться не охота).
17 ноября 2008 в 19:00
№41
Главное, шоб самому себя за ламера не принять, вернувшись через пол-года к своей же проге… :-Р
17 ноября 2008 в 17:03
каждый пишет, как ему удобно… че демогогию то развели? а на счет того, что примут за ламера увидев GoTo, вот это отожгли =)))
17 ноября 2008 в 16:02
"представьте,что Вам попалась здоровая чужая программа со своей логикой, и Вам надо БЫСТРО ее подправить"
гггг Рефакторинг рулит! Учите матчасть!!!
У меня такие случае были не раз и легко обходился без goto
17 ноября 2008 в 16:02
2 Cyber Max
Мне Мелкософт работы не давал. Я пишу мультиплатформенные проекты. На работе правда лиценхионку ХР поставили, а дома сижу под Debian
17 ноября 2008 в 16:01
#37
Натаха Mogilka
17 ноя 2008 в 14:56
============
Молодчина!!! +65536!!!
============
А если надо быстро подправить чей-то код, не разбираясь долго, шо там написсано, то всегда дешевле поймать за шкварник автора и заплатить ему, шоб ето он сам здеалЪЪЪ… ИМХО (глубокое… и шоб нихто неслышалЪЪЪ))) :-Р
17 ноября 2008 в 15:05
"быстро подправить" потому что "концепция поменялась" )))) забавное сочетание
Ну, допустим, если действительно нужно быстро внести дополнения в уже существующий код, может, твой вариант и приемлем. Если это единичный случай
А по поводу красоты кода, в теме речь на самом деле идет не о красоте, а о порядке, об удобстве управления своим алгоритмом. Когда любовь к порядку становится "устоявшимся правилом в работе", то и работа протекает быстрее. Заказчики всегда давят сроками, и от этого никуда не деться, но это не повод писать быдлокод (я здесь имею в виду не пресловутый оператор goto, а подход к программированию вообще). Кривой код, о да, в нем нет ничего плохого, если правиться он "скорее всего не будет". Но вам станет очень весело, если вдруг придется ломать голову над внезапно возникшими непредсказуемыми ошибками и пытаться в уме воспроизвести логику этой программы
17 ноября 2008 в 15:01
Для тех, кто против GoTo – представьте,что Вам попалась здоровая чужая программа со своей логикой, и Вам надо БЫСТРО ее подправить (в дальнейшем она правиться скорее всего не будет), потому что "концепция поменялась", т. е. внести какую-нибудь новую ветку. Чем переписывать алгоритм старой программы – иногда проще добавить goto по условию иписать уже по ней новую логику. Сохраняется и старый подход и добавляются новые возможности.
А по поводу красоты кода – уж очень это надумано самими програмистами. Заказчику главное, чтобы программа работала, ему пофиг, что там у Вас внутри. Если один это сделает за день, но "кривым способом", а другому понадобится месяц, но все будет "сверкать чистотой" – что выберет заказчик (при одинаковой видимости работы кода снаружи)?
А самое фиговое, когда в пользу красоты или устоявшимся "правилам работы" в жертву приносятся скорость работы программы и удобство для пользователя.
17 ноября 2008 в 14:02
Знаете, шо будет делать билгейтс в аду? – дебажить виндос… :-Р
17 ноября 2008 в 14:01
to Андрей φoίνιξ Паславский
> ггг Вспомни Милениум XD
Между прочим – эти ламеры, если ты их таковыми считаешьдали тебе, и всему остальному мируработу!!!
+ беда Милениума была на в goto.
17 ноября 2008 в 13:03
2 Cyber Max
> Я конечно извиняюсь, но Вы код примеров драйверов в Microsoft DDK
> видили? там очень даже встречается этот оператор – и я бы не сказал
> что программеры Microsoft ламеры!
ггг Вспомни Милениум XD
2 Дмитрий Гайдамович
Что ты понимаешь под "жутко ведь неструктурный он"???
А вообще я уже 5 лет пишу на Java в области J2EE. За все это время не возникло ни разу мысли использовать goto. А если код запутан, проводите рефакторинг! ЗЫ кстати о рефакторинге: если в коде есть оператор goto, то чтобы провести рефакторинг Вам однозначно в первую очередь прийдеться избавиться от него
17 ноября 2008 в 11:04
Хотите получить бесплатно семизначный номер ICQ? Тогда вам сюда – //www.semiznak.net/index.php?ref=7znakfree
17 ноября 2008 в 11:02
to Максим Fallen Angel Донцов:
> Не видел примеры таких программ, в которых его используют (в
> современных)
Вот народ пошел… Вы когда кнопки давите на клавиатуре вас обслуживает kbdclass.sys драйвер! Там тех goto…
Мобилки подключаете через USB – работает USB to COM переходник – в итоге за дело берется serial.sys драйвер, там тоже goto немеренно.. даже в ISR (обработчике прерываний) продцерудах… Еще примеры нужны?
Кто не верит – может посмотреть тут!
%DDKDIR%\3790\src\…
или в другом подобном DDK
17 ноября 2008 в 10:02
2 Alexander Cyborg Zubakov
про такую фишку я тоже думал….но вы представляете сколько будет дополнительных проверок? у меня ооочень много проходов… поэтому я и спрашивал, будет ли оптимальным использовать GoTo именно с точки зрения производительности… А с точки зрения читабельности кода… я и так один пишу))) +комменты руляд))) главное чтоб работало быстрей!
17 ноября 2008 в 2:01
goto – пережиток прошлого. Не следует его путать с jmp оператором асма! Асм низкоуровневый язык, там кроме jmp (jne, jnz и т.п.) ВООБЩЕ ничего другого нет условного, поэтому его там используют, но ТОЛЬКО внутри коротких кусков кода, иначе любая программа превращается в "написал и забыл" т.е. неподдерживаемую. Если вы встречаете goto в программах наязыках более высокого уровня то это либо _очень_старая_программа, либо программисту было лень думать, либо он недоучка :-\
Вообще, один уважаемый мной человек говорил, что goto это как мат. Не следует разговаривать матом, но когда тебе на заводе роняют на ногу станок…
17 ноября 2008 в 0:02
goto не бессмертен, он как таковой давно умер. Не видел примеры таких программ, в которых его используют (в современных)
16 ноября 2008 в 22:03
Брр, Есть такое понятие, как удобство чтения кода, да. Если вы работаете в огромной фирме, где вы пишете сотую часть одного модуля, и на основе вашего кода люди вникают, и пишут свой, то это дело одно…
А есть такое понятие, как удобство его написания. Так вот, когда надо ,что бы программа работала, а кто её будет читать – пофигу*(А этот случай, ручаюсь, наиболее частый для тех, кто просматривает данную тему), то использование goto очень даже допустимо, в необходимых ситуациях.
16 ноября 2008 в 19:03
Goto Лучше не использовать, т.к. если в программах программирования более высокого уровня поставить выход из цикла при помощи GoTo или из других структур можно пропустить, например восстановление стёка, но если программа пишется на Assembler-е, то без них там бывает не обойтись(Goto аналогична команде Jmp в Assembler-е)…
16 ноября 2008 в 18:03
"This is a road… to hell…" (c)
(песня такая есть…)
:-Р
А исходный код ваще лучче никамУ не показывать, зачем снимать штаны перед заказчиками??? (ИМХО)
16 ноября 2008 в 18:03
А разве ваш брейк не есть тот же goto с заведомо заданной меткой перехода?
И что значит для новичков? Если им про него не говорить, они и пользоваться не будут.
Запутываемость кода при использованиии рассматриваемого оператора решается банальными комментарями. А других аргументов против как таковых и нет.
16 ноября 2008 в 17:02
Vitaly ViLco Martynovich
Да! я написал только что goto бессмертен, а ты прям выразил мою мысль))
16 ноября 2008 в 16:05
Вот она стереотипность мышления.Использование goto лишь нарушает идеалогическую целостность программы, подрывая принципы ООП, не более. Он настолько же бессмертен, насколько ассемблер
16 ноября 2008 в 16:02
В современных языках он оставляеться тока для новичков и для совместимости со старыми версиями и даже в тех доке на язык большими буквами написанно что НЕ РЕКОМЕНДУЕТЬСЯ ИСПОЛЬЗОВАТЬ!!!!
16 ноября 2008 в 16:02
Я даже в том же бейсике (буть он трижды еладен!!!) без его без всякого напряга и усложнения кода обхожусь так что сама необходимость его существования для меня находиться под огромным вопросом.
16 ноября 2008 в 16:02
№19 Верно, действительно написано. Мне это еще препод по С++ сказал 4 года назад
16 ноября 2008 в 16:01
Goto must die, он ваще запутывает код, делает его нечитабельным для другого программера, ну а через некоторое время и для самого себя. Никогда не использовал и не собираюсь использовать этот оператор. Как здесь было сказано, и без него можно обойтись ,в чем я и убедился.
16 ноября 2008 в 16:00
#14
Очень правильно сказано. Никогда не использовала инструкции, подобные goto, в алгоритмах. Ну разве что только в пакетных файлах
16 ноября 2008 в 16:00
Не по-пацански, да. Хотя и неиспользование goto не даёт гарантии, что не будет "спагетти-кода". И наоборот, иногда применение goto резко упрощает запутанный кусок кода. Гуру применяют goto иногда, когда это оправдано.К примеру, в Си гуру его и оставили, потому что надо. Кстати, а давайте такой оператор как return обсудим, жутко ведь неструктурный он
16 ноября 2008 в 14:04
Goto должен умереть. Я им ВООБЩЕ не пользуюсь и живу счастливо. На той же делфи самый приметив выхода из цикла это БРЕЙК если несколько вложенных циклов то 1 флаг + брейк. На сях тоже пример был так что не надо лохматить бабушку и втирать что без него некуда. Даже математически строго дооказано что без его можно жить припеваючи а практика подтверждает теорию.
16 ноября 2008 в 14:02
Серега -<CJ>- Губченко, все обходятся, а вам не обойтись. try catch/except существует для этого.
По поводу ситуации с циклами:
//признак выхода из циклов
var endLoop = false;
for (var i1 = 0; i < count1 && !endLoop; i1++) {
….for (var i2 = 0; i2 < count2 && !endLoop; i2++) {
……..for (var i3 = 0; i3 < count3 && !endLoop; i3++) {
…………for (var i4 = 0; i4 < count4 && !endLoop; i4++) {
…………….//если надо выйти из всех циклов, делаем так:
…………….endLoop = true;
…………}
……..}
….}
}
В чем преимущества такого подхода? А в том, что когда я смотрю на эту чудовищную конструкцию, я сразу вижу, что из этих циклов возможен досрочный выход. И этот досрочный выход произойдет, если переменная endLoop пример значение true. Если я буду искать, где же в программе такое присваивание, я быстро пойму, при каких обстоятельствах осуществляется досрочный выход.
Если же будет goto, то я могу и не догадываться, что там вообще возможно досрочное прекращение, пока не изучу досконально весь код. При этом, встретив метку, я буду думать, откуда на нее есть переходы, потому что они могут быть не только из цикла, но и откуда угодно, хоть сверху, хоть снизу. Это очень сильно запутывает код.
16 ноября 2008 в 14:00
О плюсах и минусах goto легко найти в гугле. А вообще согласна с Стас vs Черняков. Абсолютно в любых ситуациях можно обойтись без него. Если тебе нужно выйти из нескольких циклов сразу, то пересмотри свой алгоритм, скорее всего его можно значительно упростить.
16 ноября 2008 в 14:00
Без Goto, например, в процессе обработке ошибок никак не обойтись!!!
16 ноября 2008 в 13:04
> to Стас vs Черняков
> Но даже если ты используешь его для повышения эффективности своей
> проги, все равно никому не показывай ее текст, т.к. любой опытный
> программер, увидев оператор goto, сразу примет тебя за ламера
Я конечно извиняюсь, но Вы код примеров драйверов в Microsoft DDK видили? там очень даже встречается этот оператор- и я бы не сказал что программеры Microsoft ламеры!
Не стоит им злоупотреблять, но и говорить что если человек написал его – он плохой программер!!!
16 ноября 2008 в 13:03
прошу прощение за,может быть, глупый вопрос,но чем координально отличается GoTo от,скажем,вызова какой-нибудь процедуры?
16 ноября 2008 в 11:02
Ну если его ещё не пофиксили из языка, то пользуйся на здоровье.
Не рекомендовали его использовать потому, что царило структурное программирование: один вход, одн выход, а goto вроде как нарушает эти принципы. Но с приходом ООП, предыдущий властитель был раскритикован. А в последнее время многие подумавыют о функциональных языках, и соответственно тут уже опять будут другие "рекомендации".
Использоание какой то констркции может вызвать негодование :
если может приводить к ошибкам
если она неэффективна
если она не удобочитаема
Оператор наш может спокойно пройти по всем критериям.
А насчёт "любой опытный программер, увидев оператор goto, сразу примет тебя за ламера" – ты вместо goto используй механизм исключений, сделаешь тоже самое, только выглядет будет солиднее, оценят твой профессионализм %))) нда..
16 ноября 2008 в 10:04
goto жив, и бессмертен
16 ноября 2008 в 10:00
Аргументы в студию! Как обойтись без GoTo в приведенном примере с циклами?
В принципе….. можно! Но это будут такие танцы с бубнами….. причем с увеличением кол-ва циклов будет расти и количество бубнов!
16 ноября 2008 в 10:00
нафиг-нафиг. просто если вышел из цикла досрочно, то смотри причину. никаких танцев с бубнами.
16 ноября 2008 в 10:00
кстати, а зачем выходить сразу из нескольких циклов? может быть эти несколько циклов стоит поместить в отдельную функцию и выходить из нее?
16 ноября 2008 в 10:00
по поводу производительности: без jmp & co вы программу вряд ли напишете. а даже если и напишете, то она будет медленее – вызовы выполняются дольше.
16 ноября 2008 в 10:00
этот вариант я рассматривал, там не все так просто, тем более вызов дополнительных процедур снижает производительность, для меня это самое критичное… и вообще вопрос был как раз касательно ухудшения производительности, а не "использовать или нет"=)
16 ноября 2008 в 9:05
хотелось написать goto holywarrr но это даже не холивар
Давно доказано, что без этого оператора можно обойтись в любой ситуации. Его использование ухудшает читаемость программы и увеличивает код. Но даже если ты используешь его для повышения эффективности своей проги, все равно никому не показывай ее текст, т.к. любой опытный программер, увидев оператор goto, сразу примет тебя за ламера
© ][