Страница 1 из 4
Использование GOTO

Добавлено:
09.01.2007 (Вт) 2:31
GM
Недавно был случай, один мой одногрупник, не смог сдать лабараторную из-за использование goto(в этом случае он использовал для выхода из трех циклов) Препод указал на это как на серьезную ошибку и сказал переделать на условные выражения.
Так к чему это: считаете ли вы оправданым использование goto?
Например в VB я использую goto для обработки ошибок, замена оператора continue, и для выхода из множества цикла.

Добавлено:
09.01.2007 (Вт) 2:50
Хакер
GoTo в On Error я ещё допускаю.
Оператора Continue я не знаю. Слушай, а какой это оператор, правоассоциативный или лево- ? Нет, в С конечно есть такое, но это не оператор а ключевое слово.
Голосовал за второе.

Добавлено:
09.01.2007 (Вт) 4:19
neic
У нас препод говорил, что-то про GoTo и сказал, что это грубая ошибка, что она нарушает архитектуру программы.
Чес слово, я понял его (т.к. он пока обьясняет для юзверей), но как использовал GoTo так и использую!
Re: Использование GOTO

Добавлено:
09.01.2007 (Вт) 7:28
GSerg
GM писал(а):Недавно был случай, один мой одногрупник, не смог сдать лабараторную из-за использование goto(в этом случае он использовал для выхода из трех циклов) Препод указал на это как на серьезную ошибку и сказал переделать на условные выражения.
Препод дятел. Суровый, сибирский.
GM писал(а):Так к чему это: считаете ли вы оправданым использование goto?
Несомненно. Для обработки ошибок, выхода из многоуровневого цикла, эмулирования отсутствующих конструкций языка, перехода на общую завершающую часть сложной процедуры из многих её мест, а также в случаях, когда логические конструкции без goto оказываются в разы сложнее и непонятнее, чем с ним (да, бывает и такое. См., например, "Совершенный код" за авторством Стива МакКоннела).
Преподу для прекращения бытия дятлом срочно читать классику в лице
http://www.rsdn.ru/forum/Message.aspx?mid=57977&pg=1
Если не осилит, пусть прочитает только первый пост, второй и последний (
спасибо, Amed).

Добавлено:
09.01.2007 (Вт) 8:40
Viper
Стараюсь обходится без GoTo, за исключением ситуаций с обработкой ошибок, где без GoTo не обойтись. Во всех иных ситуациях стараюсь избегать, однако отсутствие continue например и ситуации типа выхода из многоуровненвого цикла заставляют таки использовать GoTo. Посему, GoTo вполне имеет право на существование.
Насчет дятельности препода, использование GoTo конечно не явлется грубой ошибкой, но вот вопрос, а в какой ситуации это было сказано?

Добавлено:
09.01.2007 (Вт) 8:52
GSerg
!Viper! писал(а):Насчет дятельности препода, использование GoTo конечно не явлется грубой ошибкой, но вот вопрос, а в какой ситуации это было сказано?
GM писал(а):в этом случае он использовал для выхода из трех циклов

Добавлено:
09.01.2007 (Вт) 8:55
tyomitch
Разные преподы бывают.
Наш не только goto, но и repeat-until считал катастрофической ошибкой. Можно было только while-do.
И он был не дятел, а разработчик какой-то суперпродвинутой методики преподавания информатики, по которой чем меньше операторов человек знает, тем лучше.
Не буду отстаивать его точку зрения, хотя считаю её вполне последовательной и обоснованной.
Я верю, что программист, как ребёнок в анекдоте про голландцев, "когда вырастет -- само решит", как ему писать. И что это исключительно дело личного вкуса.
Если ему не лень стирать и писать заново уже однажды написанный и отлаженный код только из-за того, что он не может вспомнить, как он работал, -- пусть использует хоть goto, хоть ассемблерные вставки, хоть баги компилятора.

Добавлено:
09.01.2007 (Вт) 15:54
GAGArin
Если вы проходили прерывание циклов, то логично, что использование GOTO - серьезная ошибка. Вобщем-то часто в программе (обучения) есть шаблон от которого шаг влево - шаг вправо - расстрел. Причем он очевиден.
Многоуровневые циклы как правило все же не глубже трех. Иначе стоит подумть о том, чтоб обойтись без этого. Ну по крайней мере мне так кажется. Хотя ничего против GoTo не имею. Вобщем-то в QB вообще ничего кроме GoTo и If не использовал...

Добавлено:
09.01.2007 (Вт) 17:18
GSerg
GAGArin писал(а):Если вы проходили прерывание циклов, то логично, что использование GOTO - серьезная ошибка.
Почему?

Добавлено:
12.01.2007 (Пт) 18:49
Twister
чем меньше операторов человек знает, тем лучше.
Все дружно учим BrainF*ck
По теме: а можно ли в АСМе без GOTO?

Вообще, все это фигня, ибо юзает чел GOTO или нет, а компилятор его генерит. Так что толку заморачиваться?

Добавлено:
12.01.2007 (Пт) 19:23
tyomitch
Twister писал(а):Вообще, все это фигня, ибо юзает чел GOTO или нет, а компилятор его генерит. Так что толку заморачиваться?
Потому что через год ошибку придётся искать в исходнике, а не в бинарнике. Поэтому исходник должен быть таким, чтобы через год не вызывать рвоту, головные боли и кошмары по ночам.
Неужели это непонятно?


Добавлено:
12.01.2007 (Пт) 19:29
Ramzes
в ООП НЕДОПУСТИМО!!!

Добавлено:
12.01.2007 (Пт) 19:39
tyomitch
Какая связь между объектностью и goto?
И какая аргументация, кроме трёх восклицательных знаков?

Добавлено:
12.01.2007 (Пт) 19:47
Amed
tyomitch, зажатый Caps...

Добавлено:
13.01.2007 (Сб) 1:46
GM

Добавлено:
13.01.2007 (Сб) 11:14
Конь
Ну ведь для чего-то GoTo придумали, правда? Следовательно, это не может считаться ошибкой!

Добавлено:
13.01.2007 (Сб) 11:18
Хакер
Маты тоже придумали чтобы материться. Однако то что ты материшься тебя не красит. Верно?
Почти также в случае с программой.
GoTo портит логику (логику чтения программистом) и вид кода. Но есть всё таки случаи когда без GoTo либо никак, либо как, но уж никак не лучше чем с Goto

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

Добавлено:
13.01.2007 (Сб) 13:21
Ramzes
tyomitch
Зачем использовать Goto если есть методы, которые можно вызывать в случае ошибки?
Goto можно использовать в qBasic, там это приемлемо, потому, что нужно как-то ходить в разные куски программы, а в ООП это решаеться другим путем.

Добавлено:
13.01.2007 (Сб) 14:08
tyomitch
Ramzes, я ещё с прошлого раза помню, что у тебя всё программирование делится на ООП и QBasic; не нужно лишний раз демонстрировать свой кругозор
В последний раз, когда я использовал goto, это было для глубокого выхода из цикла. Сначала я бросал исключение, но в той проге для облегчения отладки все first-chance исключения сбрасываются в лог, и моё исключение забивало остальным логи ненужной ерундой. (См. тж.
http://blogs.msdn.com/ericlippert/archi ... 74117.aspx о вреде исключений в неисключительных ситуациях.)

Добавлено:
13.01.2007 (Сб) 14:17
Debugger
Использовать осторожно, очень осторожно. Для выхода из цикла или ещё чего можно, а для "перемещения по коду и остановки программы на полсекунды" не годится. Цикциклится.

Добавлено:
13.01.2007 (Сб) 14:27
Хакер
Debugger писал(а):}{ /\/\., как говориться. Использовать осторожно, очень осторожно. Для выхода из цикла или ещё чего можно, а для "перемещения по коду и остановки программы на полсекунды" не годится. Цикциклится.
Не цикциклись пожалуста. А то сначало какие-то скобкои и слэши пишешь. Потом о какой-то осторожности говоришь. Зачем осторожность? не знаю я. Есть вещи которые куда опаснее чем GoTo. Тот же CallWindowProc используемый не так. Так что goto по сравнению с ними вообще ангел.

Добавлено:
13.01.2007 (Сб) 14:55
Ramzes
tyomitch
Меня вполне устраивает ООП.
Лучше приведи мне пример, когда в ООП нельзя обойтись без GOTO. Ведь в своем первом посте в этом топике я говорил что использование GOTO именно в ООП неприемлимо, и считаеться плохим тоном. Можешь доказать обратное?

Добавлено:
13.01.2007 (Сб) 14:59
Хакер
Если язык программирования является ООП-языком, но в нём не предусмотрен выход из цикла n-ной вложенности, но есть GoTo то как прикажешь поступать?

Добавлено:
13.01.2007 (Сб) 15:04
Ramzes
Хакер
а что это за язык такой? И конкретнее задачу поставь, тогда можно по месту смотреть


Добавлено:
13.01.2007 (Сб) 15:17
Хакер
Пусть это будет VB6. Ты конечно же начнёшь возражать, что это не ООП язык, потому что ты повёрнут на .NET и ничего больше не признаёшь.
Но для этого мы условно (мысленно) расширим VB6 и придадим ему всю необходимую ООПность.
Задача: Выйти из цикла 5-ой вложенности.
Ы?

Добавлено:
13.01.2007 (Сб) 15:23
tyomitch
Ramzes писал(а):Меня вполне устраивает ООП.
Если в твоём понимании, ООП -- это всё, что не QBasic, тогда бесспорно

Ramzes писал(а):Лучше приведи мне пример, когда в ООП нельзя обойтись без GOTO.
В моём предыдущем посте.
Ramzes писал(а):Ведь в своем первом посте в этом топике я говорил что использование GOTO именно в ООП неприемлимо
Сначала расскажи, наконец, что
конкретно ты считаешь ООП. И как объектность связана с приемлимостью или неприемлипостью goto. (В прошлый раз ты в ООП записал и шаблоны, и коллекции

)
Ramzes писал(а):и считаеться плохим тоном.
Кем? лично тобой? На удовольствие.

Добавлено:
13.01.2007 (Сб) 19:29
GM
Хакер писал(а):Но для этого мы условно (мысленно) расширим VB6 и придадим ему всю необходимую ООПность.
Задача: Выйти из цикла 5-ой вложенности.
Ы?
Ramzes имееть ввиду, создание блока try...catch, в начале циклов и в конце, и там где нужно выйти из циклов, просто вызвать исключение throw.

Добавлено:
13.01.2007 (Сб) 19:36
tyomitch
Я выше писал про исключения в неисключительных ситуациях.

Добавлено:
13.01.2007 (Сб) 19:37
Хакер
GM
Разве ООП-язык предполагает наличие возможности обработки исключений.

Добавлено:
13.01.2007 (Сб) 20:18
GM
Хакер, вопрос не ко мне.
Я бы лично воспользовался goto.