Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

0    0    #1
17.08.2007 21:38

uux
Участник (+887, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1625

Великий и могучий Гоуту Неубиваемый

Тут перевод TADS-мануала неожиданно натолкнул меня на мысль: что может заставить современнх программистов использовать оператор безусловного перехода a.k.a. goto? Речь, естественно, идет не о программировании на Ассемблере, Fortran 66 и т. п., а о более-менее структурированных языках, позволяющих теоретически вообще без него обойтись. Обращаюсь к программистам среди наших форумчан (их, к счастью, есть у нас:): пользуетесь ли вы оператором goto и в каких целях?

Начну, как положено, с себя. Я goto пользуюсь, пожалуй, исключительно при программировании на Visual Basic for Applications. Делаю это по следующим причинам: во-первых, ряд процедур удобнее генерировать при помощи встроенных "визардов", а они их генерят как раз с активным использованием goto. Править каждый раз такую процедуру вручную, убирая goto - значит сводить на нет все преимущества автоматизации;). Во-вторых, безусловный переход на метку в VBA удобно использовать при проверке на возникновение ошибки. В этом случае все обработчики ошибок локализуются в конце процедуры, что делает код в целом более читаемым. И, хотя теоретически подобной группировки можно добиться и другими средствами (и, например, программируя на Паскале, я бы совершенно точно организовал такую группировку без goto), в VBA такой способ кажется почему-то наиболее естественным и удобным.

Отредактировано uux (17.08.2007 21:40)

Неактивен

0    0    #2
18.08.2007 10:30

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

Статрая, но всё ещё актуальная статья на эту тему: http://kalinin.ru/programming/cpp/14_04_01.shtml
Сам я использовал goto за последние десяток лет всего раз — был выбор: либо использовать одну метку и один оператор goto, либо раздувать программу до немыслимых размеров…

Неактивен

0    0    #3
21.08.2007 16:48

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

Учусь на математика-программиста и поэтому призераю goto. В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Использование этого оператора показывает несостоятельность программиста как такового.

Чем громче слово, тем грамотней оно должно быть написано… А так, по теории русского языка употреблённое слово "призерать" напоминает глагол "призирать", и означает, наоборот, сочувственное отношение…

Ну а теперь по факту: за давностью лет я не помню точно, что была за задача, но ситуация была что-то типа этого:

Код:

УСЛОВИЕ 1
    действие 1
    действие 2
    действие 3  <---------------------------------+
    действие 4                                    |
    УСЛОВИЕ 2                                     |
        действие 5                                |
        действие 6                                |
        УСЛОВИЕ 3                                 |
            действие 7                            |
            действие 8                            |
            УСЛОВИЕ 4                             |
                возможный переход к действию 3 ---+
            КОНЕЦ УСЛОВИЯ 4
            действие 9
        КОНЕЦ УСЛОВИЯ 3
        действие 10
    КОНЕЦ УСЛОВИЯ 2
    действие 11
КОНЕЦ УСЛОВИЯ 1

Знающие люди (Dan Dare, привет!) отмечают, что именно эту схему можно было бы решить рекурсией, если бы не ограниченность в некоторых устройствах размеров стека.

Неактивен

0    0    #4
21.08.2007 19:25

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

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

Например? Можно привести пример? И, желательно, не просто демонстрацию, что данную задачу можно сделать без goto или рекурсии, а чтобы текст читался.

Неактивен

0    0    #5
21.08.2007 21:48

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

Спину вареньем не намазть? На грубость только так и могу ответить.

А какое варенье?..

VoLk88 написал:

Олегус, дорогой, на кого учишься? По роду своей специализации я однозначно знаю, что GoTo - ненужный и не незаменимый оператор.

Уже отучился и давно, знаешь ли. Экономист, если что. Однако работаю как раз программистом (на стыке программирования и экономики). И занимаясь программированием как хобби примерно с 1989 года, я даже в машинных кодах успел повозиться. Так что я работал и с goto, и без него. Я (да и никто здесь) не призываю использовать этот оператор напропалую. Просто он есть, и иногда (ну очень редко) его использование оправдано.
А юношескую горячность лучше направить в другое русло. Подобный радикализм в таких вот пустых темах — не лучший способ сублимации…

Неактивен

0    0    #6
22.08.2007 18:41

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

Вообще чё напали-то все?

Никто, собственно, на тебя не нападает. Просто были поставлены вопросы, выдвинуты аргументы, приведены выдержки из реального практического опыта. Всё это спокойно и степенно. Ты же, VoLk88, не привёл ни одного рационального аргумента — всё сплошь эмоциональные, я уж не говорю про оскорбления. Все отсылки к авторитетам также сделаны «в общем ключе». Попробуй продавить народ конкретикой — горлопаны всегда тушуются перед голыми прозрачными фактами. Глядишь, народ и уважительней отнесётся к твоему мнению.
Это типа как спорить на тему, что можно всю жизнь прожить, ни разу человека по яйцам не ударив, — дурной тон это, всегда можно решить проблему по-другому, более цивилизованно…

Неактивен

0    0    #7
22.08.2007 22:51

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

Знаете, мне вот больше делать нечего, как каждому расписывать всё и выжимать примеры. По-моему не маленькие тут, чтобы "вынь да положь" … но киселём расплываться перед недопрограммистами я не собираюсь (и врядли кто-то хочет).

Не хочешь делать лишних телодвижений — не влезай в дискуссию будучи вооружён лишь крикливыми заявлениями. Парируя оскорблениями, ты лишь смешишь оппонентов, ибо, как заметил Blob, ничего такого, что позволило бы принять твою точку зрения на веру или почувствовать себя уязвлённым, ты пока не продемонстрировал. Так — воздух сотрясаешь…

P.S. Йоу! Почти всю мысль, оказывается, спёр у uux'а… Вот что значит медленно печатать!

Неактивен

0    0    #8
23.08.2007 17:16

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

Народ, читать очень интересно, только держите себя в руках. Давайте без мата (и производных типа «мля») в прямой речи! Разве что как цитату диалога (можно даже воображаемого) по аське с «близким другом». Типа как VoLk88 привёл лог общения с приятелем…

Неактивен

0    0    #9
25.08.2007 22:25

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

VoLk88 написал:

Меня обвиняют в фальсификации или я что-то не так понял?

Расслабься, ты как всегда ничего не понял. Судя по тексту, диалог настоящий, поскольку твой собеседник как раз понимает в программировании. Даже тени мысли о том, что его ответы ты сочинил самостоятельно, не возникло. Цени таких людей, тем более что мнение его ты вроде как ценишь, учитывая как ты стушевался, стоило ему рассказать тебе то же самое, что и другие участники форума.
Но чтобы твоя мнительность не пропадала зря, отмечу, что твоя фраза «да тут утверждают, что блядь гото клёвый и частенько приходиться им пользоваться, чтобы не раздувать прогу до немыслимых размеров, но ведь это же всю структуру нарушает!» самое что ни на есть наглое враньё, поскольку ни одно утверждение из него не соответствует действительности.
Если же ты хочешь вернуться к теме использования goto, то в дальнейших рассуждениях (я надеюсь это будут рассуждения, а не очередная истерика — кандидату в мастера по боксу это, право, не пристало) учитывай тот факт, что народ программирует на разных языках и на разных устройствах, поэтому приводимые тобой примеры как можно легко обойти применение goto в других условиях просто не реализуемы. Ту задачу, что я приводил, реализовывать без goto было бы глупостью, поскольку это была не какая-нибудь программулька «hello, world», а написанная с нуля библиотека для работы КПК Palm с фискальным регистратором (кассовый аппарат в простонародье). В этой задаче главное было — чтобы всё работало чётко, чтобы код читался, чтобы работоспособность в наименьшей степени зависела от усложнённости алгоритмов (а это всё как раз дополнительные флаги, вынесенные в функции куски кода, добавленные циклы и всё остальное, что любители сказочных стандартов добавляют в программу, лишь бы goto не использовать). И библиотека эта работает вот уже несколько лет без единого сбоя. Так что в следующий раз, когда ты захочешь что-нибудь написать по теме, попробуй писать действительно по теме, а не оскорблять окружающих или повторять какие-то общие (пусть и громкие/авторитетные) фразы — большинство присутствующих все эти фразы уже слышали по сто раз и имели время обдумать и проверить их жизненность на практике.

Неактивен

0    0    #10
27.08.2007 08:09

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

uux написал:

А как реализовать поэлегантнее пример Олегуса со вложенными условиями без goto? (Не в порядке возобновления священной войны, а просто действительно интересно;).

Конкретизируем задачу: во-первых, ограничение на стек (реальная вещь), во-вторых, кроме условий там были ещё и вложенные циклы…
Да и вообще, читайте статью Калинина Андрея «Религия и goto» (эту ссылку я приводил в начале обсуждения) — там всё расписано достаточно доходчиво, а насчёт состоятельности его как программиста — вот отзывы о нём как о преподавателе информатики МАИ…

Неактивен

0    0    #11
01.09.2007 21:15

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

Постоянно натыкаюсь на довод о читабельности, однако, народ, что вы в это вкладываете? Если взять не элегантные примеры на десяток-полтора строк, а многоэкранные листинги, то сказать, куда произойдёт переход, будет проще с goto (с его чётким указанием меток), чем если разбираться со вложенными if, for и т.п. Я уж не говорю, что придётся разгребать разного рода допонительные конструкции: флаги условия и прочее. Интересен вопрос в плане раскрытия смысла термина "читабельность"…

Неактивен

0    0    #12
02.09.2007 10:49

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

Eten написал:

Читабельность - это, когда приведенный код отформатирован отступами, именам переменных и объектов даны осмысленные имена…

Не нужно путать результат и средства достижения результата, поскольку из-за такой подмены понятий народ и скатывается к бездумному следованию неким, зачастую идеализированным, стандартам.

Неактивен

0    0    #13
02.09.2007 12:04

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

Так никто не спорит, что отступы и всё такое улучшают читабельность. Но тогда каким образом goto выпадает из этой схемы? Есть явное указание меток,  поэтому пробегая глазами по коду можно точно сказать, откуда и куда осуществляется переход. Без комментариев с окончаниями циклов и условий («}», «end», «endfor», «endif») и то сложнее разобраться. Но разумеется, если использовать goto напропалую, то глаза начнут разбегаться и про какую-либо читабельность действительно можно будет забыть.
И вообще мне кажется, что «запрет» на использование goto несколько искусственен и продвигается только для того, чтобы научить людей думать перед тем как что-то делать: продумывать логическую схему алгоритма и все точки и возможности выхода-повторения. Оператор goto в алгоритме — что-то типа «Ой» от колючки на пути. Если таких вот колючек на пути дофига, значит, не той дорогой, видимо, пошли.

И странно, что никто не поднял тему досрочного выхода из процедуры/функции: return, в середине «тела» процедуры/функции. Разве это не из этой же серии?..

Неактивен

0    0    #14
15.10.2007 11:12

Olegus t.Gl.
Участник (+1073, -250)
Откуда: Москва
Зарегистрирован: 01.03.2001
Сообщений: 2904
Вебсайт

Re: Великий и могучий Гоуту Неубиваемый

На одном форуме наткнулся на тему, посвящённую циклу «FOR», с очень чудными мыслями:

Break - нехорошо, так что, когда надо, я использую while или изменяю значение X (лучше while, конечно).

сам операторы break и continue вобще не использую - уж очень они мне goto напоминают

Мне не нравится идея использования break в циклах, это дурной тон. Так же как continue, exit/return и пр. Точка выхода из подпрограммы должна быть одна.

Я, например, тоже склоняюсь к мысли, что лучше бы, если точка выхода из процедуры/функции одна, хотя порой это всё же приводит к излишней запутанности, но вот операторы "continue" и "break" довольно близки идеологически к естественному языку, так что, на мой взгляд, смотрятся уместно.

Неактивен

Powered by PunBB
© copyright 2001–2026 iFiction.Ru