Форум программистов, компьютерный форум, киберфорум
Обо всем!
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/41: Рейтинг темы: голосов - 41, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 43
1

За что так не любят Goto?

27.01.2010, 22:54. Показов 7402. Ответов 52
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Может я такой непонятливый, но объясните кто может - почему у многих не самое чучшее отношение к оператору Goto. Я этого не понимаю, в некоторых случаях (правда не часто), он вполне может пригодиться.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2010, 22:54
Ответы с готовыми решениями:

Почему все так не любят Delphi
Всем привет. Объясните мне пожалуйста почему все так не любят Delphi? Я сам новичок в...

Почему все так не любят Баскова?
Слышал про его планирующийся грандиозный концерт с Кабалье в Лужниках в июне, кому ни скажу- все...

Почему все так не любят tkinter?
Почему, по вашему мнению, не нужно использовать стандартную библиотеку графического интерфейса...

Clion + cocos2d-x почему так не любят друг - друга ? (Mac OS X)
Доброе врем суток уважаемые формучане. Кто имел опыт подружить эти два чуда меду собой,...

52
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
28.01.2010, 10:03 2
У кого не самое лучшее, это проблемы того человека. Действительно, goto бывает нужен. Просто посмотри историю: в былые времена кроме goto ничего не было. Люди очень привыкли к goto, а потом появились составные операторы, собственно из-за того, чтобы отказаться от ненужных goto. И началась массированная атака заскорузлого сознания: де, не используйте goto. Многие люди, как, впрочем, и в обычной жизни, понимали это промывание мозгов как догму, как заповедь и стали считать, что, используя goto, грешат. Вот и все. На самом деле ничего плохого в goto нету. Только надо с умом к это му оператору подходить. В моей практике только однажды возникла ситуация, когда goto здорово сокращал и распутывал код. Только однажды. За 10 лет.

Делаем выводы )
0
0 / 0 / 0
Регистрация: 10.07.2007
Сообщений: 105
28.01.2010, 20:05 3
Случай в слудию! За 12 лет - ни разу не нашел веского аргумента для использования готы.
0
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 43
28.01.2010, 23:24  [ТС] 4
Danissimo, это наподобие тех, кто всю жизнь мучился, делал в ДОС-е меню, а теперь каждому это под силу сделать за пять минут - вот и обидно им. Или люди, писавшие веб-страницы вручную теперь просто ненавидят визуальные редакторы типа FrontPage, HotMetall и др., вот и пропагандируют, что Notepad - лучший редактор ))
0
2 / 2 / 2
Регистрация: 23.06.2007
Сообщений: 397
29.01.2010, 00:08 5
to VitFil: Так как у меня опыта не очень много, то вот пример (VB):
Do While(Условие)
If Условие2 Then GoTo 111
...
Loop
....
111:
....

Обойтись без GoTo можно, но как мне кажется с лишними затратами (переменные, строки кода) + понижение читаемости

to Алакс: вот только страница, созданная в Notepad 'весит' гораздо меньше, чем в FrontPage. (разумеется, одинаковые по виду и содержанию)
Если кто не знает, то есть еще много мест, где скорость доступа весьма мала (и за собственные денежки). Так что если наплевать на пользователя - то тогда конечно -FrontPage
0
1 / 1 / 1
Регистрация: 03.06.2008
Сообщений: 101
30.01.2010, 09:38 6
А кто-нибудь из вас пробовал разбирать лапшу из этих goto, написаную другими программистами?
У меня лично такой опыт имеется, до сих пор во сне кошмары снятся.
0
2 / 2 / 2
Регистрация: 23.06.2007
Сообщений: 397
30.01.2010, 12:39 7
Ага, ясно, без GoTo лапши не получается
0
Ghost
30.01.2010, 21:04 8
Коль пошла такая пьянка - режь последний огурец )))
Резану и я )))

Резко негативное отношение к данному оператору связано с тем, что с его помощью очень легко написать ... сверхзапутанную программу.

Да, есть ситуации, когда без него - никак - обработка ошибок в VB(A), но в остальных случаях без него можео не напрягаясь обойтись.
Более того, видя частое (более 1 раза на 1000 строк кода) использование GOTO я делаю вывод об общей изначальной непродуманности алгоритма. С учетом того, что 999 строк без него обходились, то и в остальных случаях тоже можно обойтись.

Любителям использовать GOTO могу для прикола посоветовать заодно отказаться от ООП и процедур/функций, написать программу в 10 000+ строк и отладить её, после чего отдать на сопровождение и доработку лучшему другу. Через год встретиться лично и узнать о себе много нового.

Для тех, кто не понял - вот ПРОСТЕЙШИЙ пример - не поймете - нет смысла говорить дальше:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void FillFileContent(DWORD dwBufID, CFile &f2d, __int64 i64Size)
{
    try
    {
        f2d.Seek(0, CFile::begin);
        for (;i64Size;)
        {
            DWORD dwSizeWritePart(
                (SLOW_KILL_BUFFER_SIZE * sizeof(TCHAR) > i64Size) 
                ? static_cast <DWORD> (i64Size) : 
                SLOW_KILL_BUFFER_SIZE * sizeof(TCHAR));
 
            f2d.Write(g_buf[dwBufID], dwSizeWritePart);
            i64Size -= dwSizeWritePart;
        }
    }
    catch(...)
    {
        cerr << _T('Error on filling file content.') << endl;
    }
}
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Function CSVFormat(stIn As String, stChars As String) As String
Dim li As Long, lCX As Long, bComma As Boolean
lCX = Len(stChars)
bComma = False
For li = 1 To lCX
If (InStr(stIn, Mid(stChars, li, 1)) <> 0) Then
bComma = True
li = lCX + 1
End If
Next li
 
If (bComma) Then
stIn = '''' + Replace(stIn, '''', '''''') + ''''
End If
 
CSVFormat = stIn
End Function
Если читаемость обоих примеров для вас одинакова - WelCome To GOTO World!!!, если видите разницу (не претендую на красоту и стиль - выдрал первые под руки попавшиеся куски кода) - то поймете, что я хотел сказать.

PS. Сейчас пошерстил написанный за 10 лет код - нигде кроме ассемблера и VB(A)-обработчиков ошибок GOTO не нашел.

PPS. 2 oldpasp - идиот и с помощью процедурного программирования напишет такое, что за неделю 10 строчек поймешь, а умный и с GOTO сделает читаемый код, но ... вот автоматическая коробка, (гидро)усилитель и климат контроль - что лучше - машина с этими прибамбахами или без них? Часто реально вы можете (да и нужно) выжимать из машины все, на что она способна? Если да - то вы или ошиблись форумом (Вам к автогонщикам) или ..... ну что-же - КАМАЗ вам на встречку - другие целее будут.

Вроде все.
2 / 2 / 2
Регистрация: 23.06.2007
Сообщений: 397
31.01.2010, 00:36 9
Вот именно, что 'с его помощью очень легко написать ... сверхзапутанную программу.'
Но ведь и 'спички детям не игрушка'. Поэтому как мне кажется об уровне продуманности можно судить не только по частому использованию, но и по полному неиспользованию.
Можно отнести goto к 'мощным' средствам. Бездумное использование любого мощного средства неизбежно приводит к катастрофе. Полный запрет на его использование - к лишним затратам ресурсов.

to Ghost: а у меня вот знакомые водилы, так не очень-то автоматику (коробку передач) любят. Говорят на пересеченку с ней лучше не соваться. (А у нас 99% дорог - пересеченка)
0
Ghost
31.01.2010, 00:49 10
2 oldpasp ))) Что - не спится? )))

По поводу автоматов - пойдем на www.auto.ru? )) По своему опыту скажу - что в лоб, что по лбу. Если не застявать - то разницы нет, если застрявать - то см. мой вопрос о выжимании из машины всего. При этом даю зуб, что не умеющему раскачивать машину не опытному водителю (предлагаю определиться с терминологией - я предлагаю трактовать термин 'опытный водитель' как водителя со стажем от 600 часов (2 года езды по 1 часу в день (2 года - см. условия строховых компаний ))))), умеющего в яме раскачать автомобиль и вывести его враскачку из мокрой ямы) абсолютно все равно - на какой коробке застрять посреди поля - проще не соваться или искать трактор.

По поводу 'Поэтому как мне кажется об уровне продуманности можно судить не только по частому использованию, но и по полному неиспользованию' - укажите мне пример, где бы использование GOTO РЕЗКО (подчеркиваю - резко!!!, потому, что при прочих равных из-за того, что надо глазами искать метку - уже падает читаемость) возрастает читаемость кода и я признаю Вашу правоту. При этом читаемость должна возрасти не для меня - мне-то один хрен - какой код читать, а для нормального начинающего программера. Тогда и поговорим.

В случае же структкрного программирования, выделяя блоки, я явно указываю, к какому блоку что относится. Продолжим дискуссию? (по поводу автоматов и GOTO)???)
Ghost
31.01.2010, 00:51 11
у нас 99% дорог - пересеченка - простите - Вы из каких краев? Если не секрет, конечно.
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
31.01.2010, 10:26 12
2VitFil: кода не дам -- давно было. Какой-то алгоритм: то ли сортировщик, то ли еще что-то. Вобщем, не дам -- нет его уже )

В любом случае, из всего написанного можно сделать один вывод: goto не хорош и не плох, только думать надо, его используя, впрочем, как и в любой другой ситуации ) Собсно, ничего другого ожидать и не приходилось.
0
0 / 0 / 1
Регистрация: 19.10.2008
Сообщений: 173
31.01.2010, 11:45 13
А вы вспомните причину использоваия Goto, и все встанет на свои места. Ведь раньше (когда в школах учили только Basic на AT,Корветах, УКНЦ и прочей 'нечисти') в Basic не было операторных скобок (раз), процедур и функций (два), не говоря про ООП. И поэтому программы писались так :
if (условие) Then GOTO 10 ELSE GOTO 20
А по-другому и нельзя было сделать.
Программить сейчас надо, все-таки соблюдая принципы структурного программирования (по-моему так это называется). А использование GOTO косвенно указывает на 'костность мышления' и, явно, на непродуманность алгоритма, да и на ленивость программера.

to oldpasp:
А почему нельзя
...
Do While(Условие1) and (Условие2)
...
или
...
If Условие2 Then Exit Do 'Но так тоже нехорошо
...
Спасибо, что просвятил, что goto - 'мощное средство'.

PS: Да, я противник использования goto, не хочу я его использовать и все! И другим не советую.

PSS: В VB только в : on error goto ...
0
2 / 2 / 2
Регистрация: 23.06.2007
Сообщений: 397
31.01.2010, 12:50 14
* Секрет, примерно за Уралом - на Восток
* К автомобилям я вообще отношусь более чем прохладно, так что передал лишь мнение знакомых. А что, на внедорожниках и большегрузах сплошь и рядом автоматы ставят? (это для самообразования, чтоб 'блеснуть' в обчестве)
* А как быть с теми, кто только начинает программировать (как я например), они-то Assembler-ом не испорчены. Кстати, область действия goto - внутри процедуры (т.е. на самом нижнем уровне 'структорного программирования' - вот здесь за слова прошу не цепляться, может это и по другому называется). (Нет, конечно, если одна процедура занимает километры, то тогда конечно, сложно метки искать)
* Нет уж, померла так померла - никаких goto, в т.ч. и в OnError
* На мой взгляд косность мышления - это когда 'гуру сказал так, значит так и не иначе'
Условие2 появляется внутри цикла. А после окончания цикла обязательно выполнение еще некоторого кода
* Пожалуйста, не жалко. Да, не пытайтесь с помощью goto создать 3d - 'мощное' - это значит независимое с большой свободой действия.

ps. Этот спор (goto- не goto) один-в-один похож на спор с верующими - у них тоже 'так и никак иначе'
0
2 / 2 / 2
Регистрация: 23.06.2007
Сообщений: 397
31.01.2010, 13:06 15
Во, позвонил 5-ти знакомым с джипами. В общем мнение единодушное - атомат для 'чайников'. Конечно, машину она (авт. коробка) сохранит от насилия, но и сильно ограничивает места, куда можно попасть, а опытный водитель насиловать машину не будет без необходимости, но попадет туда, куда надо (а не туда, куда конструкторы автомата разрешили). Еще одно мнение (портного) - самое мощное средство - обычная иголка.

Так что отказ от использования чего либо - это скорее неумение пользоваться этим.
0
0 / 0 / 1
Регистрация: 19.10.2008
Сообщений: 173
31.01.2010, 14:50 16
>* А как быть с теми, кто только начинает программировать (как я например), они-то Assembler-ом не испорчены.
В Assembler'е нет goto, так же как if, for,while..., оно там все по-другому обзывается . А почему это ASM портит? Не понял...
>Кстати, область действия goto - внутри процедуры ...
А что goto можно прыгать между процедурами!? А я-то, и не знал! Надо попробовать обязательно!
> * Нет уж, померла так померла - никаких goto, в т.ч. и в OnError
Предлагаешь писать без обработки ошибок!? Очень смелый поступок, а на это я пойтить не могу.
Goto сам по себе, это, разумеется, не чудовище, однако его использование, когда 'ломается' алгоритм, например, для 'прыжков' из(в) тела(о) цикла, неправильно. Я и сам иногда 'грешу' им, например: переписал процедуру, а старый код пока хочу оставить, комментировать >500 строк текста лень, прыг через него и все (при этом не нарушается логика алгоритма!). Еще, при возникновении критических ошибок, когда продолжение выполненения функции бессмысленно, можно 'прыг на конец' или Exit Sub.
>Так что отказ от использования чего либо - это скорее неумение пользоваться этим
В целом согласен, но что касается goto, че там уметь-то?

PS: А тем, 'кто только начинает программировать' лучше сначала просто поверить, что лучше обойтись без GOTO. ...И полистать asm на досуге - очень полезное занятие. А осознание того, в каких случаях goto незаменим придет позже (на меня просветление еще не снизошло)
PSS: Отвечая на вопрос, чем же GOTO плох, скажу, что его использование нарушает логику программы. Если же не нарушает, значит goto не в тему, и его спокойно можно заменить другой конструкцией.
0
zeus
31.01.2010, 14:51 17
Операторы Goto так не любимы потому, что программа написанная с их использованием не укладывается в древовидную структуру. Программу с использованием операторов Goto вообще тежело как-то формально структуризовать, следовательно код такой программы тяжело сопровождать и документировать.
2 / 2 / 2
Регистрация: 23.06.2007
Сообщений: 397
31.01.2010, 16:01 18
to t-80: . Не надо стараться казаться умнее всех. (вариант - дурнее, чем есть на самом деле). Думаю Вы прекрасно поняли, о чем речь. Перед тем, как ответить, прочитайте дискуссию еще раз. (а может и несколько) - чтобы не воспринимать желаемое за действительное.
0
0 / 0 / 1
Регистрация: 19.10.2008
Сообщений: 173
31.01.2010, 16:22 19
???
Кстати, не поленился, попробовал goto из одной проц-ры в другую - не прокатило (ну естественно!).
0
0 / 0 / 1
Регистрация: 15.12.2007
Сообщений: 381
31.01.2010, 16:43 20
Господа! А Вам рекурсия нравится!?
Хорошая вешь, но ведь и без нее можно обойтись. А в древовидную структуру ее ложить стека не хватит
Как на меня (коль уж такой флейм пошел), то GoTo имеет право на жизнь

Например вот типичный пример
Код
M1:
Do While (Bollean)
  ...
  If (Boolean) Then GoTo M1
  ...
  If (Boolean) Then Exit Do
  ...
Loop
и его альтернатива:
Код
Do While True
  Do While (Boolean)
    ...
    If (Boolean) Then
     ...
     Exit Do
    End If
    ...
  Loop
  If (Boolean) Then Exit Do
Loop
Мне как-то первый вариант нравится больше.

Но если GoTo ставится примерно в таких случаях:
Код
Sub MySuperSub(A as Boolean)
  If not A Then Goto M1:
  ... 'Дохрена кода и мне просто влом тащить End If
M1:
  MsgBox 'Я сдесь был! Пиво пил!'
End Sub
то тут автор действительно 'узнает о себе много нового'
0
31.01.2010, 16:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2010, 16:43
Помогаю со студенческими работами здесь

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

Что любят поисковики?
Какие теги или может что то еще любят поисковики?

Переделать фрагмент кода так, чтобы использовался оператор goto
Ребяяяят!! Помогите переделать в goto данный фрагмент программы! Все плохо... for (int i = 0;...

Превращение кода с goto в код без goto
Помогите переписать это код без goto и потери производительности.А то мне кажется написано...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru