Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор goto, Хорошо или плохо 
:(
    Опции темы
Goganchic
Дата 7.5.2007, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



Прочитал сейчас всю тему: чуть глаза из орбит не выкатились.
Попытаюсь ответить на все: гоуту - зло. Тут приводился пример с линуксом, насчет ручной оптимизации и применения фишек GCC это да, есть такое, и еще, насчет кода ядра, вы когда нибудь читали документацию если не ко всему ядру, то хотя бы к каким-нибудь его инфраструктурам? Я читал доки к netfilter'y и там ясно написано, что код писал хомяк, а чел только записывал коменты с его (хомяка) слов. smile Вот такие линуксойды весселые smile
Еще был пример с вложенным циклом, мне по этому поводу мой бывший препод информатики, у которого опыт практической разработки прог (т.е. он не просто теоретик, а так сказать заслуженный практик программирования) говорит так: не надо создавать такие ситуации чтобы были вложенные циклы из которых надо выходить сразу во вне и все будет хорошо.
PM Jabber   Вверх
MAKCim
Дата 7.5.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Goganchic @  7.5.2007,  07:38 Найти цитируемый пост)
Еще был пример с вложенным циклом, мне по этому поводу мой бывший препод информатики, у которого опыт практической разработки прог (т.е. он не просто теоретик, а так сказать заслуженный практик программирования) говорит так: не надо создавать такие ситуации чтобы были вложенные циклы из которых надо выходить сразу во вне и все будет хорошо. 

как говорится, ну-ну  smile 
Цитата(Goganchic @  7.5.2007,  07:38 Найти цитируемый пост)
гоуту - зло

просто не хочется в очередной раз доказывать, что ты не прав  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Goganchic
Дата 7.5.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



MAKCim, мы говорим о Си или о Си++? Если последнее, то там гоуту просто не нужен, т.к. имеется механизм исключений, который может заменить гоуту, причем в более наглядной форме.
PM Jabber   Вверх
0lmer
Дата 7.5.2007, 13:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 3.12.2006

Репутация: нет
Всего: -1



Лично я за недолгие 3 года программирования использовал готу не больше 4 раз для выхода из циклов поскольку без него размер кода увеличивался а читабельность уменьшалась.

По моему сам по себе готу не есть зло, зло - это когда его криво используют.
(это типа оружия: стреляет не оно само а человек который его держит) 
PM   Вверх
JackYF
Дата 7.5.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Goganchic @  7.5.2007,  12:23 Найти цитируемый пост)
Если последнее, то там гоуту просто не нужен, т.к. имеется механизм исключений, который может заменить гоуту, причем в более наглядной форме. 


Хе. А скорость?
И далеко не факт, что в более понятной.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 7.5.2007, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(JackYF @  7.5.2007,  16:58 Найти цитируемый пост)
Хе. А скорость?

а вот скорость на порядок снижается

Добавлено через 1 минуту и 30 секунд
Цитата(Goganchic @  7.5.2007,  12:23 Найти цитируемый пост)
мы говорим о Си или о Си++? Если последнее, то там гоуту просто не нужен, т.к. имеется механизм исключений, который может заменить гоуту, причем в более наглядной форме.

а ты сказал
Цитата(Goganchic @  7.5.2007,  07:38 Найти цитируемый пост)
гоуту - зло

применительно к чему?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Anikmar
Дата 7.5.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @  7.5.2007,  19:43 Найти цитируемый пост)
а вот скорость на порядок снижается

А то и больше.

Цитата(Goganchic @  7.5.2007,  12:23 Найти цитируемый пост)
MAKCim, мы говорим о Си или о Си++? Если последнее, то там гоуту просто не нужен, т.к. имеется механизм исключений, который может заменить гоуту, причем в более наглядной форме. 


ИМХО
Исключения ни коим образом не сделаны для замены goto - слишком серьезный механизм, из пушки по воробьям.
Если есть три-четыре вложенных цикла, из гущи которых нужно быстро выпрыгнуть, то при использовании механизма исключений будут очень ощутимые тормоза. При использовании дополнительных флагов - резко потеряется читабельность.
А вот при наличии goto и удобочитаемой метки, да еще в обозримом пространстве программы - дешево и сердито. Всем понятно и красиво.

PM MAIL ICQ   Вверх
Goganchic
Дата 7.5.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



Как сказал 0lmer, goto это оружие, ну так вот, оружие тоже разным бывает: одним владеть можно научиться легко, а другим можно и руки себе отхряпать, если ты не шаолиньский манах. Ну так вот, для широких масс goto это зло, я не спорю, что сливки программистского общества могут использовать этот оператор красиво и безопасно, но когда каждый второй начинает закашивать под профессионала, то получается сущая неразбериха и трудновыловимые баги. Себя я не отношу к сливкам программистского общества, поэтому goto не использую.
Теперь насчет исключений: по-моему, в Си++ многие вещи "жутко тормозят", но как известно, они позволяют сделать код более читаемым и кратким (при соответствующей документации и соблюдении стандартов кодирования, конечно, я не пытаюсь сказать, что любой Вася Пупкин сядет за Си++ и сразу же сделает офигительный шедевр). Современное оборудование может спокойной существовать с небольшой "тормознутостью", причем последняя будет не очень заметна (вы уж извините, но не каждый сидить и с секундомером измеряет за сколько времени у него загрузилась картинка, за 1 сек. или за 1.5). Так что вывод таков: если приложение не критично по скорости (если приложение - мощный веб-сервер, для которого 10% потеря в скорости подобна смерти, то тут я даже спорить не буду - все средства оптимизации хороши), то от использования конструкции goto можно отказаться вполне.
Это мое мнение, может оно и не правильное, но я так думаю.

Это сообщение отредактировал(а) Goganchic - 7.5.2007, 22:26
PM Jabber   Вверх
Anikmar
Дата 7.5.2007, 23:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Goganchic @  7.5.2007,  22:24 Найти цитируемый пост)
Так что вывод таков: если приложение не критично по скорости (если приложение - мощный веб-сервер, для которого 10% потеря в скорости подобна смерти, то тут я даже спорить не буду - все средства оптимизации хороши), то от использования конструкции goto можно отказаться вполне.


По-моему весь спор о том, что можно от него отказаться или нужно. Конечно можно! Только вот вопрос: если с goto удобнее что-то сделать нужно ли  менять логику программы, нагромождать скобки и условия с циклами, чтобы обойтись без него?

Я даже встречал где-то мнение: Если вам не обойтись без goto пересмотрите логику вычислений...

Ну-ну. Мы программируем, чтобы получить результат или текст программы на высокоуровневом языке без оператора goto? Смотря кто какую себе цель ставит  smile 
Цитата(Goganchic @  7.5.2007,  22:24 Найти цитируемый пост)
Теперь насчет исключений: по-моему, в Си++ многие вещи "жутко тормозят", но как известно, они позволяют сделать код более читаемым и кратким 

ИМХО. Код программы должен быть понятен для сопровождения. Но это не значит, что его надо писать ради сопровождения. Это не стихи - готовый продукт все-таки работающая программа. И если картинка грузится на 30 секунд дольше, а потом этот "легкий для сопровождения" код без доделок попадает в другую программу, где таких картинок нужно вывести 100 - получим 50 минут  smile  И благодраность от конечного пользователя.

ИМХО
Нет только черного и белого. За разумный компромис! 

Цитата(Goganchic @  7.5.2007,  22:24 Найти цитируемый пост)
в Си++ многие вещи "жутко тормозят", 

Ну уж тут точно скорость от рук на 99% зависит! На мой взгляд Си++ позволяет писать очень скоростные программы (с goto или без - это как раз вторично). Вопрос правильного применения.

PM MAIL ICQ   Вверх
Goganchic
Дата 7.5.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5



AnikmarMAKCimJackYF0lmer, в общем я понял свой просчет: мы просто говорим о разных степенях слова "отказаться", просто в моем понимании отказаться, значит использовать только при очень крайней необходимости smile
PM Jabber   Вверх
srd
Дата 8.5.2007, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Гм, если отвлечься от Си++ и поговорить о Си, то я вообще не вижу альтернативы goto.
Код

void some_function()
{
    ...
    if (!invoke_some_api())
        goto cleanup;
    ...
    if (invoke_other_api())
        goto cleanup;

cleanup:
    чистим память
    освобождаем ресурсы
}

Как это сделать без goto? Можно завести переменную для хранения статуса и проверять её перед каждым действием. Можно воспользоваться известным трюком с do {} while(0) и вываливаться из цикла по break, если что-то сломалось. Но мне кажется, что goto и проще и понятней smile

З.Ы.
Видел имитацию исключений в Plain C с помощью setjmp/longjmp, завёрнутых в макросы типа TRY/CATCH etc


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
nerezus
Дата 8.5.2007, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Цитата

(это из области создания компиляторов, если пример интересный могу привести
 Мм, state machine? Нам тоже пропод твердил, что надо юзать goto, чтобы в условиях не захлебнуться. 
Однако я так и не понял, нахрена: когда писал сам, то у меня была только 2ая уровень вложеенности условий. Как и в примере.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Vyacheslav
Дата 8.5.2007, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(0lmer @  7.5.2007,  13:04 Найти цитируемый пост)
Лично я за недолгие 3 года программирования использовал готу не больше 4 раз для выхода из циклов поскольку без него размер кода увеличивался а читабельность уменьшалась.

Лично я за 12 лет работы на С++ не использовал его никогда. Не то что бы из приниципа. Просто так получалось.

Добавлено @ 10:30
Цитата(MAKCim @  7.5.2007,  19:43 Найти цитируемый пост)
а вот скорость на порядок снижается


Так у ж прямо  на порядок? Ну и к тому же мой опыт показывает, что при создании больших программныъ комплексов, главное не быстродействие, а читаемость кода.  

Цитата(srd @  8.5.2007,  06:18 Найти цитируемый пост)
Как это сделать без goto? 

Данный пример для С не катит smile 
Код


 void some_function()
{
    ...
    if (invoke_some_api()) {
     ...
       if (invoke_other_api()) {
          ....
       }
   }
        
    чистим память
    освобождаем ресурсы
}
 




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 8.5.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Vyacheslav @  8.5.2007,  10:23 Найти цитируемый пост)
Ну и к тому же мой опыт показывает, что при создании больших программныъ комплексов, главное не быстродействие, а читаемость кода.  


Спор вялотекущий и ни очем, конечно.

Видимо я старомодный. Но объяснять пользователю, в ответ на его претензии к быстродействию "Зато посмотрите, какой читаемый код" я вижу не совсем правильным. То что исключения разворачиваются по времени действительно на порядок медленнее - уже точно обсуждалось, когда спорили что лучше: возврат кода ошибки или исключение. 
PM MAIL ICQ   Вверх
srd
Дата 8.5.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Цитата(Vyacheslav @  8.5.2007,  17:23 Найти цитируемый пост)
Данный пример для С не катит

То есть предлагаешь кучу вложенных if-ов ради того, чтобы избежать goto? Это ещё хуже smile


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0886 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.