Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2010, 14:09   #31
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Цитата:
Сообщение от wyvern Посмотреть сообщение
И то, последнее время все чаще и чаще слышу советы в данной ситуации использовать try-catch блок и просто-напросто из глубины циклов выкидывать простенькое исключеньице...
Нашел на сайте http://insidecpp.ru антипаттерн, который как раз относится к использовании механизма исключений для таких целей:
Цитата:
Exception handling
Этот антипаттерн представляет собой реализацию нормальной логики работы программы с помощью механизма исключений. Например, рекурсивный поиск по дереву может в качестве результата поиска кидать исключение. Такая реализация на первый взгляд может выглядеть заманчиво и удобно, но не более чем на первый взгляд.
Исключения должны использоваться с одной единственной целью — проинформировать систему об ошибке. Использование исключений как инструмента для управления логикой программы вносит неоднозначность. Глядя на конструкцию try-throw-catch, программисту совершенно не очевидно, для чего именно эта конструкция используется. Кроме того, управление логикой через исключения и система оповещения об ошибках, построенная на исключениях, могут попросту мешать друг другу, поскольку они построены на одном механизме.
Для обработки ошибок используйте только исключения, а исключения — только для обработки ошибок.
Oleg_SK вне форума Ответить с цитированием
Старый 24.07.2010, 17:01   #32
Korben5E
Форумчанин
 
Аватар для Korben5E
 
Регистрация: 13.07.2010
Сообщений: 346
По умолчанию

вы все пережевываете GOTO???

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

а это черевато перегрузкой конвейера процессора и существенной задержкой исполнения программы

сейчас это скажем не очень актуально....

так что остается только понимание кода, если вам хочется оставить на предприятии после себя "СЛЕД" - используйте goto почаще
и икать будете до конца жизни.
Non est culpa vin, sed culpa bibentis
Korben5E вне форума Ответить с цитированием
Старый 24.07.2010, 21:38   #33
Tema_Crazzzy
Форумчанин
 
Регистрация: 29.04.2010
Сообщений: 114
По умолчанию

Вообще среди опытных программистов использование оператора goto считается признаком дурного тона, равносильно ковырянию в носу за столом.....:-)
Tema_Crazzzy вне форума Ответить с цитированием
Старый 25.07.2010, 13:15   #34
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Я бы сказал, что дурным тоном являетя не употребление оператора goto, а злоупотребление им; разумное использование в малом количестве способно улучшить ясность кода. К примеру, в уже опомянавшейся задаче выхода по условию из нескольких вложенных циклов IMHO использование этого оператора предпочтительней как в плане читаемости кода так и его скорости работы; альтернативные пути решения этой задачи (будь то использование для этих целей механизма обаботки исключений или выделение вложенных циклов в отдельную функцию где вместо goto используется return) на мой взгляд ни грамма не улучшают читаемости кода, а вот на скорость его работы влияют однозначно негативно.
Oleg_SK вне форума Ответить с цитированием
Старый 25.07.2010, 15:07   #35
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Вопрос, конечно, нетривиальный. Лично мне действительно пока известен только один разумный вариант использования goto - при выходе из нескольких вложенных циклов.
А вот при глубокой рекурсии (например, при поиске по дереву), на мой взгляд лучше использовать исключения (но при этом обязательно в коде делать четкие комментарии на этот счет) и производить спецификацию исключений, как-нибудь так:
Код:
class ValueFound;

template<class T> class Tree
{
//...
void find(T value) throw(ValueFound);   //Генерирует ValueFound для выхода из рекурсии и сообщения о нахождении необходимого элемента
//...
};
В подобной ситуации goto вообще вряд ли себе представляет, куда он будет выходить за пределы своей компетенции. Исключение об этом и не должно знать, catch позаботится об этом самостоятельно.
В случае завертывания циклов в функцию и замену goto на return, иногда можно делать функцию inline, тогда, возможно, не будет никаких проблем с быстродействием (впрочем, в зависимости от того, насколько умный компилятор, могут быть, а могут даже без inline не быть).
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. использование условного оператора в теле операторов цикла с условием и после него машко Помощь студентам 1 22.06.2009 00:52
использование условного оператора после операторов цикла с условием машко Помощь студентам 8 21.06.2009 23:59
использование условного оператора в теле оператора цикла с условием машко Помощь студентам 2 21.06.2009 23:55
Использование оператора условия Virtson Microsoft Office Access 2 15.12.2006 16:13