Тут перевод TADS-мануала неожиданно натолкнул меня на мысль: что может заставить современнх программистов использовать оператор безусловного перехода a.k.a. goto? Речь, естественно, идет не о программировании на Ассемблере, Fortran 66 и т. п., а о более-менее структурированных языках, позволяющих теоретически вообще без него обойтись. Обращаюсь к программистам среди наших форумчан (их, к счастью, есть у нас:): пользуетесь ли вы оператором goto и в каких целях?
Начну, как положено, с себя. Я goto пользуюсь, пожалуй, исключительно при программировании на Visual Basic for Applications. Делаю это по следующим причинам: во-первых, ряд процедур удобнее генерировать при помощи встроенных "визардов", а они их генерят как раз с активным использованием goto. Править каждый раз такую процедуру вручную, убирая goto - значит сводить на нет все преимущества автоматизации;). Во-вторых, безусловный переход на метку в VBA удобно использовать при проверке на возникновение ошибки. В этом случае все обработчики ошибок локализуются в конце процедуры, что делает код в целом более читаемым. И, хотя теоретически подобной группировки можно добиться и другими средствами (и, например, программируя на Паскале, я бы совершенно точно организовал такую группировку без goto), в VBA такой способ кажется почему-то наиболее естественным и удобным.
Отредактировано uux (17.08.2007 21:40)
Неактивен
Один мой коллега с работы (все пишут на C/C++) очень любит использовать goto. Причем, никто его не заставляет. А даже наоборот, уговаривают не использовать. Но не помогают даже угрозы. Ну не может человек мыслить структурно. Научился программировать во времена ассемблера, с этим и остался. Его исходники никто не трогает, и вникать в них не возьмётся. Вот такая страшная история. %)
Неактивен
Статрая, но всё ещё актуальная статья на эту тему: http://kalinin.ru/programming/cpp/14_04_01.shtml
Сам я использовал goto за последние десяток лет всего раз — был выбор: либо использовать одну метку и один оператор goto, либо раздувать программу до немыслимых размеров…
Неактивен
Каждый раз когда пишу чтото в урке, пользуюсь гоуту
А вот в "нормальной" жизни уже года 4 использовать этот прекрасный оператор не было нужды
Неактивен
goraph написал:
Каждый раз когда пишу чтото в урке, пользуюсь гоуту
Вот-вот:). Кто скажет, что урка - не структурный язык?) А вообще да, в те далекие времена, когда ваш покорный осваивал Си (в котором он, впрочем, безнадежный любитель), оным оператором не пользовался вообще.
Неактивен
U> Во-вторых, безусловный переход на метку в VBA удобно использовать при проверке на возникновение ошибки. В этом случае все обработчики ошибок локализуются в конце процедуры, что делает код в целом более читаемым.
Аналогично. Вообще я только в хендлерах и использую.
Просто меня еще в лицее научили, что использование GOTO плохой тон.
ЧТо касается урки, то там дело вкуса, можно использовать proc, можно goto.
Отредактировано - VampirE - (19.08.2007 19:43)
Неактивен
- VampirE - написал:
ЧТо касается урки, то там дело вкуса, можно использовать proc, можно goto.
интересно, и как ты без помощи гото предложишь написать например любой цикл?
Неактивен
Согласен. Тут промах вышел. Про циклы в урке совсем забыл.
Неактивен
Учусь на математика-программиста и поэтому призераю goto. В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Использование этого оператора показывает несостоятельность программиста как такового.
Неактивен
VoLk88 написал:
В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Разумеется. Но это не всегда целесообразно. Внимательно прочитай весь тред с начала, сходи по ссылке на статью. Попробуй разобраться сам, прежде чем "рубить с плеча".
VoLk88 написал:
Использование этого оператора показывает несостоятельность программиста как такового.
И ты сразу поверил? Какой наивный.
Неактивен
VoLk88 написал:
Учусь на математика-программиста и поэтому призераю goto. В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Использование этого оператора показывает несостоятельность программиста как такового.
Чем громче слово, тем грамотней оно должно быть написано… А так, по теории русского языка употреблённое слово "призерать" напоминает глагол "призирать", и означает, наоборот, сочувственное отношение…
Ну а теперь по факту: за давностью лет я не помню точно, что была за задача, но ситуация была что-то типа этого:
УСЛОВИЕ 1 действие 1 действие 2 действие 3 <---------------------------------+ действие 4 | УСЛОВИЕ 2 | действие 5 | действие 6 | УСЛОВИЕ 3 | действие 7 | действие 8 | УСЛОВИЕ 4 | возможный переход к действию 3 ---+ КОНЕЦ УСЛОВИЯ 4 действие 9 КОНЕЦ УСЛОВИЯ 3 действие 10 КОНЕЦ УСЛОВИЯ 2 действие 11 КОНЕЦ УСЛОВИЯ 1
Знающие люди (Dan Dare, привет!) отмечают, что именно эту схему можно было бы решить рекурсией, если бы не ограниченность в некоторых устройствах размеров стека.
Неактивен
Использую goto в самых редких и крайних случаях, иначе говоря когда он либо упрощает алгоритм и тем сокращает затраты времени на выполнение кода алгоритма или, когда без него не обойтись. Одно точно известно, что повсеместное использование goto - дурной тон программирования в ЯВУ всех мастей. Это только программисты "старички", наученные еще с времен DOS, могут использовать goto правильно и при этом не портить и не усложнять алгоритм. В IF языках программирования и даже в УРКе goto имеет свою обоснованность и его использование нормальное явление, но уж мне то, точно сложновато читать огромный исходник написаный на урке с применением goto (хотя он там повсеместно ).
В данный период времени применяю goto, только в сложном алгоритме в синтаксическом анализаторе команд СТК для считывания постоянной строки (заключена между " ). В этом алгоритме с применением goto кол-во команд C# составило минимум 50, а без него получилось бы минимум 100, а о затратах памяти в этом случае вообще молчу (цифры условны и приведены для ощущения разницы).
Так что использовать goto рекомендуется тогда и только тогда, когда он действительно необходим.
Отредактировано Eten (21.08.2007 17:57)
Неактивен
Для начала хочу отметить, что обсуждаем тут не опечатки и даже не грубейшие ошибки в словах русского, а конкретный вопрос программирования.
Я не говорю про Урок - там просто глупо делать циклы и условия, а исходный код старой версии я видел - там всё очень локанично и красиво реализовано, так что программирование квестов с обычным программированием сравнить можно только закрыв глаза.
Можно не лезть в рекурсию и обойти её в большенстве случаев, а приведённый выше пример решается без ГоТо, хоть и не так просто как с ним, с пмощью цикла с условием (или вообще с помощью любого цикла).
Неактивен
VoLk88 написал:
Можно не лезть в рекурсию и обойти её в большенстве случаев, а приведённый выше пример решается без ГоТо, хоть и не так просто как с ним, с пмощью цикла с условием (или вообще с помощью любого цикла).
Например? Можно привести пример? И, желательно, не просто демонстрацию, что данную задачу можно сделать без goto или рекурсии, а чтобы текст читался.
Неактивен
Olegus t.Gl. написал:
VoLk88 написал:
Можно не лезть в рекурсию и обойти её в большенстве случаев, а приведённый выше пример решается без ГоТо, хоть и не так просто как с ним, с пмощью цикла с условием (или вообще с помощью любого цикла).
Например? Можно привести пример? И, желательно, не просто демонстрацию, что данную задачу можно сделать без goto или рекурсии, а чтобы текст читался.
Спину вареньем не намазть? На грубость только так и могу ответить.
Олегус, дорогой, на кого учишься? По роду своей специализации я однозначно знаю, что GoTo - ненужный и не незаменимый оператор.
Неактивен
Я конечно знаю, что каждый следующий выпуск программистов хуже предыдущего, но...
VoLk88 написал:
Учусь на математика-программиста и поэтому призераю goto.
Почему-то вспомнилось "я не верю в гороскопы потому что я Лев, а все Львы большие скептики" (с)
Неактивен
VoLk88 написал:
Спину вареньем не намазть? На грубость только так и могу ответить.
Причем тут грубость? Олегус совершенно резонно попросил привести пример реализации приведенного им алгоритма без goto после того, как Вы, уважаемый Volk88, отделались общими словами.
Кстати, для пуристов и апологетов структурного программирования - вот как это можно сделать без ГоуТу:
ДолойГоуту=false УСЛОВИЕ 1 ИЛИ ДолойГоуту Если НЕ ДолойГоуту действие 1 действие 2 КонецЕсли действие 3 ДолойГоуту=false действие 4 УСЛОВИЕ 2 И (НЕ ДолойГоуту) действие 5 действие 6 УСЛОВИЕ 3 И (НЕ ДолойГоуту) действие 7 действие 8 УСЛОВИЕ 4 И (НЕ ДолойГоуту) Если НАМ ОЧЕНЬ НУЖНО НА ДЕЙСТВИЕ 3 ДолойГоуту=true КонецЕсли КОНЕЦ УСЛОВИЯ 4 Если НЕ ДолойГоуту действие 9 КонецЕсли КОНЕЦ УСЛОВИЯ 3 Если НЕ ДолойГоуту действие 10 КонецЕсли КОНЕЦ УСЛОВИЯ 2 Если НЕ ДолойГоуту действие 11 КонецЕсли КОНЕЦ УСЛОВИЯ 1
(Я молчаливо предполагал, что пара УСЛОВИЕ-КОНЕЦ УСЛОВИЯ - это цикл. Если это не так, то как минимум УСЛОВИЕ 1-КОНЕЦ УСЛОВИЯ 1 придется сделать циклом).
В целом, наверное, код читается, хотя, конечно, громоздко... да и эффективность упадет в разы (в связи с тем, что количество условных операторов резко возросло).
VoLk88 написал:
Олегус, дорогой, на кого учишься? По роду своей специализации я однозначно знаю, что GoTo - ненужный и не незаменимый оператор.
Незаменимых операторов вообще нет (за исключением, пожалуй, условного;).
Отредактировано uux (21.08.2007 21:07)
Неактивен
Всем привет!
Эх, сколько же споров я провел на эту тему...
Итак:
1. Действительно, без готы можно обойтись. Всегда.
2. С точки зрения перформанца другие способы, в большинстве случаев - проигрывают.
3. С точки зрения асма все другие способы тоже не лишены готов.
4. Иногда читабельней готу использовать, нежеле лепить маниакально что-то другое. См. MSDN.
Пока всё
Неактивен
VoLk88 написал:
Спину вареньем не намазть? На грубость только так и могу ответить.
А какое варенье?..
VoLk88 написал:
Олегус, дорогой, на кого учишься? По роду своей специализации я однозначно знаю, что GoTo - ненужный и не незаменимый оператор.
Уже отучился и давно, знаешь ли. Экономист, если что. Однако работаю как раз программистом (на стыке программирования и экономики). И занимаясь программированием как хобби примерно с 1989 года, я даже в машинных кодах успел повозиться. Так что я работал и с goto, и без него. Я (да и никто здесь) не призываю использовать этот оператор напропалую. Просто он есть, и иногда (ну очень редко) его использование оправдано.
А юношескую горячность лучше направить в другое русло. Подобный радикализм в таких вот пустых темах — не лучший способ сублимации…
Неактивен
Сам я очень редко использую goto- стараюсь обходится без него. За последние лет 7 использовал может раза два... Но есть куча НО...
VoLk88 написал:
Учусь на математика-программиста и поэтому призераю goto. В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Использование этого оператора показывает несостоятельность программиста как такового.
Если ты математик-программист, то должен знать несколько вещей:
"Постулат" (или аксиома) - это то, что принимается без доказательств. Однако, насколько я знаю, доказатаельство ненужности goto - имеется. Так что это теорема, а не "постулат".
Структурный или неструктурный стиль программирования - абсолютно никак не пересекается с использованием goto.
В молодости, когда мне было лет 15 и я писал только на ассемблере, я это хорошо понял.
Имеется масса хорошо структурированных программ на ассемблере, где без goto (он же jp, он же jmp и так далее) вообще программу никак не напишешь.
И имеется масса поделок любителей всяких визуал-пофиговин, которые своими корявыми ручёнками накалякали безобразнейший код без goto в котором чёрт ногу сломит... Увы... нонче такой код скорее правило. Мало кто пишет с хорошими комментариями...
Кстати, загляни в исходники прекрасной ОС Linux - там есть довольно много goto. В целях увеличения скорости и уменьшения объёма кода. Хотя золотое правило - ограничиваться goto внутри одной процедуры...
Надеюсь не будешь утверждать, что у программистов ядра линукс - плохой стиль ? Или что они несостоятельны ?
Неактивен
Господа, а че вы к циклам то пристали >. Если при написании цикла на языке Т нельзя вообще обойтись без goto, то это сильный минус для языка Т и его автора. И этому автору не помешает намекнуть, что его язык не может быть высокоуровневым если у него нет стандартных операторов, которые не могут не то, что выполнить команду цикл, даже позволить реализовать все команды основанные на общем алгоритмическом языке. А этот общий алгоритмический язык пишется схем-блоками. А раз уж в языке есть синтаксические конструкции основанные на определенных операторах, то уж точно, что goto будет использоваться в промежуточном коде, но самой программой. А вы господа, ломитесь на уровень промежуточного кода с примерами goto. Еще бы продемоснтрировали древную работу похожую на работу с массивами.
Мне чем C# нравится, так это возможностью не дать сделать те вещи, как это делалось в C++, которые потом губят всю прогу из-за простой нелепости. И goto там можно использовать только внутри одной функции, а не делать переход за ее границы, во время выполнения этой же функции. Поэтому, может показаться, что вариант C# строже и конкретней C++, но он дает гарантии разумного использования команд, так чтобы не было возможности нарушить логичность кода.
З.Ы.
Урку привел, как пример широкого использования goto.
Под языком Т, можно понимать любой язык, который реализует все стандартные действия алгоритма на уровне школьного.
И отмечу на последок, редко встречаются языки, где нет такого понятия в синтаксисе, как цикл. Его изучить не сложнее, чем оператор условного ветвления и возможностей он даст больше, нежели примение goto.
Неактивен
Такой резонанс! Спасибо! Так вот, что хочу сказать:
Blob написал:
Кстати, VoLk88. А как ты "по роду специализации" относишься к "switch, case" стэйтменту?
Хорошая коснтрукция, с помощью которой как раз можно обойти рекурсию во многих случаях (ну, например при вычислениии факториала).
"Постулат" (или аксиома) - это то, что принимается без доказательств. Однако, насколько я знаю, доказатаельство ненужности goto - имеется. Так что это теорема, а не "постулат".
Доказательства для бесполезного оператора? Можно ещё напридумывать кучу операторов и надоказывать теорем, не правда ли?
Я не знал, сколько тебе лет, Олегус, но теперь уважаю твой возраст. А то, что ты экономист, а не программист по образованию очень жаль - ты пропустил множество предметов касающихся алгоритмов и программирования.
А не использую гоуту, так как про него и не помнил никогда - всегда на "подсознательном" уровне обхожусь и причём легко.
Кстати, загляни в исходники прекрасной ОС Linux - там есть довольно много goto. В целях увеличения скорости и уменьшения объёма кода. Хотя золотое правило - ограничиваться goto внутри одной процедуры...
Надеюсь не будешь утверждать, что у программистов ядра линукс - плохой стиль ? Или что они несостоятельны ?
Не люблю линух - я люблю пользоваться нужными мне программами, а не воевать всё время с пингвинами, уж простите.
Неактивен