Тут перевод TADS-мануала неожиданно натолкнул меня на мысль: что может заставить современнх программистов использовать оператор безусловного перехода a.k.a. goto? Речь, естественно, идет не о программировании на Ассемблере, Fortran 66 и т. п., а о более-менее структурированных языках, позволяющих теоретически вообще без него обойтись. Обращаюсь к программистам среди наших форумчан (их, к счастью, есть у нас:): пользуетесь ли вы оператором goto и в каких целях?
Начну, как положено, с себя. Я goto пользуюсь, пожалуй, исключительно при программировании на Visual Basic for Applications. Делаю это по следующим причинам: во-первых, ряд процедур удобнее генерировать при помощи встроенных "визардов", а они их генерят как раз с активным использованием goto. Править каждый раз такую процедуру вручную, убирая goto - значит сводить на нет все преимущества автоматизации;). Во-вторых, безусловный переход на метку в VBA удобно использовать при проверке на возникновение ошибки. В этом случае все обработчики ошибок локализуются в конце процедуры, что делает код в целом более читаемым. И, хотя теоретически подобной группировки можно добиться и другими средствами (и, например, программируя на Паскале, я бы совершенно точно организовал такую группировку без goto), в VBA такой способ кажется почему-то наиболее естественным и удобным.
Отредактировано uux (17.08.2007 21:40)
Неактивен
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)
Неактивен
VoLk88 написал:
2Sfunx
Какая глупость про if-goto... в селект-кейс (на С) вообще все пункты выполняются до бреак, начиная с отмеченого, и он является "полуаналагом" if then else (elseif elseif elseif...) end if (это для пущей понятливости)
Sfunx говорил не о внешнем сходстве (о котором толкуете Вы), а о внутреннем представлении... Говоря примитивно, select-case - это своего рода мнемокод для "структурированной" записи конструкции if-goto.
VoLk88 написал:
И линух - не самая удобная (это 100%) и надёжная уж п(р)оверь. Виндой пользуются в России 95% пользователей и софт в основном под неё пишут. Дрова хрен под линух найдёшь, да просто КУЧА НЕДОСТАТКОВ! Но не о линухе...
Я не разделяю мнения Sfunx'а об однозначном и безоговорочном преимуществе Linux перед Windows, но цель его ссылки была не в этом. Он привел это как пример серьезной программы на структурном языке программирования, где, тем не менее, используется goto. И привел он этот пример в качестве контр-аргумента на Ваше безапелляционное (и ничем, кроме апломба, не подтвержденное) утверждение о том, что "использующий goto несостоятелен как программист" (поскольку считать несостоятельными авторов Linux - очевидная нелепость).
VoLk88 написал:
Если никто из вас не может без GoTo обойтись это совсем не значит, что больше никто не сможет! Короче, GoTo не есть истина и всегда обхожу эту дрянь, а ты, дорогой Sfunx можешь и дальше пользоваться чем тебе угодно, в любых целях и количествах.
Уверен, Sfunx необычайно счастлив и польщен таким милостивым разрешением.
VoLk88 написал:
А если бы ты был повнимательнее при работе с отладчиком, то заметил бы, что jmp, jp, jnz не всегда используются как GoTo, чаще это тот самый If.
Т. е. и в Ассемблере можно обойтись без goto? Да, это действительно новое слово в программировании.
VoLk88 написал:
А с машиной Тьюринга игрался? Читал статьи самого Тьюринга или Поста? Нет? Оно и видно...
А Вы омуля на Байкале ели, уважаемый Volk88?
VoLk88 написал:
Знаете, мне вот больше делать нечего, как каждому расписывать всё и выжимать примеры. По-моему не маленькие тут, чтобы "вынь да положь". Так обычно в технарях учат - делай так и вот так, а теория лишняя. Я сам начал программировать и учился в основном по исходникам, а теперь сам же могу из теории и общих положений вынести для себя что-то.
VoLk88 написал:
Пусть тушуются все кому не лень над голыми фактами, но киселём расплываться перед недопрограммистами я не собираюсь (и врядли кто-то хочет).
Если уж Вы высказываете свое мнение, то будьте любезны (и готовы) его обосновать. А если не можете и не хотите, то либо держите его при себе, либо как минимум не удивляйтесь, что на Вас "нападают".
Вы тут ссылаетесь на "технари" (я только не понял, на технические ВУЗы или на техникумы), а сами ведете спор именно в таком ключе: не пользуйтесь goto, потому что это низзя! Раз пользуетесь goto - значит, козлы!
VoLk88 написал:
Может новый топик начать: "Великий и могучий Вайл Неубиваемый", так там найдутся те, кто скажет, что без него никак и всё тут и скрещивать самому цикл с условием можно, но геморно, хотя в машинном коде всё будет аналогично, просто дело удобства.
А вот это уже будет банальный плагиат.
Неактивен
Xlomid[оманад] написал:
Елки-палки, вы бы так игры обсуждали... а еще лучше - писали, вовсю используя свои программистские таланты (хотя, ясное дело, профессиональным программистам среди форумчан и так более чем хватает практики).
Хлом, в десятку!![]()
Неактивен
VoLk88 написал:
И вобщем мы тут говорим не о программировании огромнейших длиннющих программ, а о текстовых квестах.
На сайте в целом - да. Но не в разделе "Флейм" (где мы разговариваем в т. ч. "обо всем на свете") и не в этом конкретном топике (где был вопрос, кто как пользуется goto в программировании вообще, в не только текстовых квестов).
Неактивен
VoLk88 написал:
Уважаемые, самые умные и хорошие, самые талантливые и честные, самые клёвые программисты и самые учёные из доучившихся, к вам обращаюсь. Мы тут говорили о конкретном операторе goto, а не о переходах как таковых. Логично предположить, что первое сообщение выглядело бы примерно так:
"Как вы относитесь к многострочным программам? Можно ли обойтись одной строчкой?".
Переходы всегда есть, а вот конекретно goto - нет!
Я про одно, а вы про другое, как малые дети всё равно что.
Наверное, я тупой, но в этом абзаце вообще ничего не понял.
А вообще эта тема была задумана не как повод к "священной войне" (хотя, каюсь, мог бы догадаться, чем оно все закончится) - мне просто действительно любопытно было узнать, для каких задач (в идеале - так с конкретными примерами) в современных условиях может применяться оператор безусловного перехода. Такая информация для меня особенно интересна в связи с тем, что я не являюсь профессиональным программистом (хотя в принципе программировать люблю), и теоретических знаний в этой области мне, увы, не хватает. То есть фактически я самым наикорыстнейшим образом собирался нагнуть весь наш форумский коллектив на бесплатные курсы повышения моей программерской квалификации;).
И, кстати, несмотря на весь флейм в прямом смысле этого слова, кое-что полезное я тем не менее почерпнул. Поэтому огромное спасибо всем участникам дискуссии.
VoLk88 написал:
А ты, зеррр уважаемый, программист или писатель? Может и моё упущение, но в игры твои я не играл, да и как писателя тебя совсем не знаю, только вот на форуме и в ЖЖ читал, да и только.
Zer, может, и не программист и не писатель (на это он гораздо лучше ответит сам), но одно могу сказать точно - для популяризации ИЛ в России он сделал (и делает) очень и очень немало... А обзоры его так точно читаются как классный приключенческий роман (в отличие от постов некоторых товарищей на форуме;)...)
Отредактировано uux (27.08.2007 06:42)
Неактивен
Gremour написал:
Товарищи, если мне не изменяет память, то изначальная тема топика была о целесообразности использования оператора безусловного перехода goto в СТРУКТУРНЫХ языках программирования (речь шла о ТАДС). Коим не являются машинный код или ассемблер. Какой машинный код генерирует компилятор языка -- сугубо на совести компилятора. Язык -- это абстракция от машинного кода.
Это в общем-то правильно (за исключением того, что о TADS речь не шла), просто потом дискуссия сместилась в сторону флейма;).
Gremour написал:
Пример из Кернигана и Ричи на языке C++ решается с помощью предназначенного для этого механизма исключений (exceptions). На худой конец, можно обойтись разбиением на функции, так, чтобы goto превратился в return. Я лично не люблю перебарщиваний и запихивания длиннющего алгоритма в одну функцию. Хорошее разбиение на функции только улучшает читабельность программы.
А как реализовать поэлегантнее пример Олегуса со вложенными условиями без goto? (Не в порядке возобновления священной войны, а просто действительно интересно;).
Неактивен
zerrr написал:
Сужу по РТАДС - я делал там набросок 6 локаций и пары-тройки пазлов : занял процесс около 2 дней, при том, что в программировании я абсолютный ноль и делал все исключительно на похожих примерах, которых в инете пруд-пруди.
А нет желания повторить (и развить) опыт?![]()
Неактивен
zerrr написал:
Насколько реально написать систему похожую на Inform 7, на великом-могучем? Ну, или перевести. Я слышал, что у 7-го Информа "детских болезней левизны" и прочих проблем, до черта, но все таки, если можно написать, что-то вроде Dead Cities, When in Rome и т.п. значит не все так плохо.
Ну, я сам об Inform 7 знаю только понаслышке, но, если вспомнить о том, что его перевели на испанский, то и на русский перевести, наверное, можно. Другой вопрос, что лично меня в обозримом будущем на это точно не хватит.
А, ну еще Adrift есть, где программирование в прямом смусле этого слова вообще не требуется...
Отредактировано uux (30.08.2007 06:47)
Неактивен
Olegus t.Gl. написал:
Я, например, тоже склоняюсь к мысли, что лучше бы, если точка выхода из процедуры/функции одна, хотя порой это всё же приводит к излишней запутанности, но вот операторы "continue" и "break" довольно близки идеологически к естественному языку, так что, на мой взгляд, смотрятся уместно.
Да и вообще, излишний пуризьм до добра не доводит. Я вот вспоминаю книжку по Паскалю (не самую плохую, кстати), где автор в главе, посвященной ООП, утверждал, что в идеале все поля объекта должны быть скрыты от программиста, и последний должен взаимодействовать с ними исключительно через методы. Т. е. типа если у объекта есть поля x, y, то писАть вот так
with object do x:=1; y:=2; end with;
не круто. Обязательно надо внутри объекта определить некий метод:
procedure SetXY(FirstVar, SecondVar: integer); virtual; begin x:=FirstVar; y:=SecondVar; end;
и впоследствии для обращения к этим полям использовать исключительно вызов
SetXY(1, 2);
К чести автора, его запала хватило только на пример, иллюстрирующий данную главу; впоследствии он прекрасно обращался к полям объекта наиболее естественным образом.
Нет, я, конечно, и сам люблю стилистически безупречные вещи, но во всем должна быть мера...
Неактивен