![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Albinos_x |
|
||||||||||||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: нет Всего: 108 |
Вот попросили выложить... выкладываю....
Куда приводит GOTO С детства нам говорили, что в программах использовать goto нельзя. Это было табу. Долгие годы я не мог его переступить. Некоторые особо рьяные ценители читаемости текста желали также запретить условные переходы, оставив только циклы, но к счастью их призывы до меня не дошли. Однако goto у меня непременно ассоциировался с плохо написаным кодом. Поработав побольше, я пришел к выводу, что хороший текст должен быть таким: 1. Продолжать работать в любом случае, не падать при несрабатывании каких-либо функций. 2. Отслеживать все ошибки исполнения, по возможности их обходить и записывать толковый файл лога, по которому можно диагностировать проблему. 3. Быть компактным и легким для восприятия. Кроме того, хороший код содержит минимум неявно выполняемых операций. 4. Освобождать все занятые ресурсы и размещенную память в случае неудачи. Соблюдению этих нехитрых условий зачастую помогает оператор перехода, что я попытаюсь проиллюстрировать ниже. Рассмотрим различные методы стили написания функции, которая заполняет указанный файл символом 'a'. Итак:
(Внимание - я привожу не полноценный текст С++, а условный код, опуская неважные с точки зрения стиля программирования параметры функций). Код прозрачен, однако крайне груб - ошибки не обрабатываются, лог ошибок не ведется. Проверки и освобождение ресурсов "в лоб"
Страшно подумать, сколько раз будут дублироваться CloseHandle, как тяжело читать и модифицировать приведенный код, и в скольких местах нужно будет добавлять запись в лог о причине несрабатывания функции. Что нам принесет C++. В C++ все делается через классы. Соответственно, перед тем как разработать функцию нужно создать набор классов-оберток для объектов, которые в ней присутствуют:
После такой "небольшой" подготовительной работы код придет к виду:
Так уже значительно легче, но крайне напрягает необходимость писать класс на каждый используемый объект. Тут проблем масса - начиная со сложностью передачи экземпляра класса-оболочки в другие функции, и до неочевидности последовательности вызова деструкторов при выходе из функции. Неочевидный код предполагает ошибки: 1. Первым вызовется деструктор file, а потом map (если экземпляр map создан раньше), что может в некоторых случаях привести к потере ресурсов. (типичный пример - удалить сначала HPEN, выбранный в HDC, а потом сам HDC). 2. Невиртуальность деструктора в handle_object не вызовет ошибки компиляции, однако деструктор не будет вызван при удалении объектов. Напомню также, что к ведению лога ошибок мы так и не приступили. Для справедливости замечу, что C++ вместо return в случае несрабатывания функции позволяет использовать оператор throw, однако прозрачность кода при этом становится настолько мала, а код настолько откровенно опасней, что я пожалуй не буду рассматриавть этот вариант. Хорошее решение: Вспомним про наш опальный оператор:
Жить стало легче. С одной стороны инициализация и освобождение ресурсов прописаны явно (чем достигается прозрачность текста), с другой стороны объем дополнительного кода минимален. Запись журнала И наконец, одним росчерком добавим запись в лог всех непредвиденных ситуаций:
Код сохранил очевидность и понятность, однако все без исключения ошибки времени исполнения записываются в лог, чтобы потом оказать нам неоценимую помощь при анализе неисправностей у удаленного пользователя. Eще варианты использования goto Есть еще одна синтаксическая конструкция, в котором использование goto предпочтительней. Речь пойдет об обработке исключительных ситуаций с возможностью для пользователя повторить попытку. Вот так нам рекомендуют писать блюстители частоты языка.
Цикл на мой взгляд совершенно лишний, тем более что в ветке, когда все в порядке, код в цикле исполняется один раз. На мой взгляд совершенно неверно такие конструкции применять с использованием цикла. Далее - вариант с goto:
Как видим, все стало очевидней, обработка ошибки легко отделяется от основного текста, а также практически бесплатно получаем полную информацию в логе ошибок. Андрей Ямов 28.04.2004 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||||||||||||
|
|||||||||||||||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Пример на Си++ откровенно неудачен.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Бредовая статья и такие же аргументы.
Оригинал здесь. Даже в таком простом примере использование RAII понятнее, более сопровождаемо, и оправдывает усилия на написание оберток. Если автор не умеет читать C++ - это его проблемы. "Легкость" логирования в неструктурном коде вообще убила. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| DeadSoul |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
угу. Albinos_x,
-------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
||||
|
|||||
| Earnest |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Воистину так. Что восхищает, так это апломб г-на Ямова. Можно было бы согласится с автором, если бы речь шла о чистом С без классаов и исключений... Но "обертки" потрясают до слез, особенно заявление
учитывая способ объявления
а также
Это сообщение отредактировал(а) Earnest - 25.10.2005, 19:28 -------------------- ... |
||||||||
|
|||||||||
| Albinos_x |
|
||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: нет Всего: 108 |
я не автор статьи:
попросили выложить почитать, вот я и выложил....поэтому пинать меня не надо, к тому же, если Вы обратили внимание, что моих сообщений в разделе С# только несколько штук, а остальные в Делфи, поэтому код я не разбирал и ещё:
поэтому не стоит принимать всё так близко к сердцу... PS: а вообще интересно узнать мнения, т.к. собираюсь углублять свои знания по С#. В Паскале, особенно Делфи про то, что пишет автор, сильно можно не заморачиваться, и он будет всё равно читабельным. А вот про С#, ничего сказать не могу, т.к. знаю его поверхостно -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||
|
|||||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Это был вопрос Voidу. Но сути это оно, вопрос был правильно ли я понял перевод. -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Да. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| S.A.P. |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: 9 Всего: 71 |
Ну вот набросились... Приведите пример как правильно, сравним, а goto - сакс каждый кричать сможет, будучи уверенным на 100% в своей правоте.
ИМХО виной всему сишный WinAPI, а обертки писать задолбаешься, лучше уж MFC тогда. |
|||
|
||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Он не только Сишный, мне казалось WinApi универсальная вещь. Именно это и накладывает свои ограничения -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: нет Всего: 108 |
ну...тогда извините -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
ОФФТОП:
Автор статьи, кстати, зарегистрирован на винграде: AndyY. Правда он здесь не появлялся ещё с лета, а так можно было бы поспорить Это сообщение отредактировал(а) Дрон - 26.10.2005, 23:21 -------------------- Да. Именно так. |
|||
|
||||
| Neitron |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Пара-тройка строк о таинствах структурного программирования.
Любая программа является комбинацией трёх базовых программных конструкций: следование, ветвление и цикл. Доказана как необходимость этих конструкций, так и их полная достаточность (некоторые учёные сводят любую одну из конструкций к суперпозиции двух оставшихся, но это тема скользкая, и не будем её здесь касаться). Следование - операторы выполняются в порядке очереди, один за другим. Графическое представление:
Ветвление - в зависимости от выполнения условия происходит выполнение операторов по альтернативному пути. Графическое представление:
Цикл - операторы выполняются циклически постоянно или до выполнения определённого условия. Графическое представление:
Обратите внимание, внезапная передача управления "по метке" структурным программированием не предусмотрена в принципе, как излишняя. Поэтому лучшее, что следует сделать - это построить поток выполнения в своей программе таким образом, чтобы он состоял из трёх упомянутых конструкций. -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||||
|
|||||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
особенная понимаешь её "излишество", когда приходится выходить break'ом из вложенных циклов. Особенно когда ты забываешь про то, что находишься во вложенном цикле. Здравствуй, дебагер. ЗЫ. Сейчас набегут жависты, которые из вложенных циклов выходят за раз плюнуть и закидают помидорами. Это сообщение отредактировал(а) Mayk - 27.10.2005, 17:15 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
использовать или нет goto - это одно
но приводить аргумент "излишество" в пользу отказа от него - другое тогда лучше прийти к машине Тьюринга - там нет ничего лишнего кроме того, сами циклы могут быть реализованы с помощью goto так что "излишество" - никак не довод... Это сообщение отредактировал(а) maxim1000 - 27.10.2005, 17:21 -------------------- qqq |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
Кстати- Адрей Ямов наш бывший форумчанин Мой учитель в МФС Добавлено @ 17:46 http://forum.vingrad.ru/index.php?showuser...&nickname=AndyY Добавлено @ 17:48 Можно непосредственно обратится к нему и посмотреть, что он скажет -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Neitron |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
goto небезапасный выход из цикла. В ассемблере, счетчиком цикла является регистр CX соответсвенно выход производится после того как регистр уйдет в нуль. что дает goto? выход происходит, но регистр не сбрасывается. Если компилятор конечно извращается без встроенного в процессор оператора цикла, то извините. -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||
|
|||||
| S.A.P. |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: 9 Всего: 71 |
только из цикла они выскакивают примерно так же как мы по goto переходим, только метка перед циклом помещается |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
Умеет и даже очень. Человек пытается разрушить правила, которые мы подчеркивали из книжек. Но никто не разу не усомнился в книжныхх правилах. Я иной раз использую goto. Когда мне удобно. Я использую for, чаще чем while в три-четыре раза. Но это дело удобства, хотя и при невнимательности, можно с ними вылететь в дебаг.. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Каждый раз, когда едисвенным выходом из ситуации является goto, я полностью перерабатываю текущий алгоритм.
Выход из положения, оператором goto является первым признаком, плохо спроектированного и продуманного кода. Это сообщение отредактировал(а) Neitron - 27.10.2005, 18:02 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
А как быть с обьектами, которые разрушаются, при выходе из цикла? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
При чём тут ассемблер? Сишные компиляторы вовсе не обязаны использовать CX. И они его не всегда используют. Хорошо если они вообще испоьзуют регистр и loop. Что не всегда так. Кстати, при break'е cx'ы тоже не обязаны занулится. (хотя бы потому что в стандарте сей существование RCX/ECX/CX не оговаривается) Это сообщение отредактировал(а) Mayk - 27.10.2005, 18:08 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Coocky
Вот именно, ты сам только что ответил на вопрос. Объекты не разрушаются, регистры не сбрасываются... -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
У моего компилятора иное мнение на этот счёт
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
Дык я и говорю за то, что можно контролировать разрушение обьекта... Разве это плохо? И я еще не увидел ни одного НОРМАЛЬНОГО аргумента против goto, кроме привычки "неудобно"... -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Не спорю. Фанатизму не место в программировании, и структурное программирование не догма. Но, ИМХО, в приведенных примерах goto не к месту. Совсем. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Neitron |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Для оптимизациооного кода, использование процессорных циклов, является наилучшим вариантом. Не думаю, что реализации упускают такую возможность. Но все равно, я всегда находил иной алгоритм, чтобы goto выкинуть из кода. -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||||
|
|||||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
Mayk
Ну хитрец! А че в цикл засунул? Ты цикл из goto сделай и выложи! -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Neitron |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Для контролирования времени жизни обекта в Си++, придумали методы new и delete. Это сообщение отредактировал(а) Neitron - 27.10.2005, 18:15 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||
|
|||||
| Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
да без проблем.
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
Я подвожу итоги!
три оператора могут(должны for, while, goto. два первых-одно и тоже. Только вот goto работает без разрушения обьектов внутри него. Ну и. Теперь слово за ненавидящими goto в пользу while и for -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Если имеется в виду x86 инструкции loop, то это уже давно не так. Цикл закодированный с помощью обычных команд перехода получается быстрее. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
Mayk
И че-рушится? А если фигурные скобки убрать? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
имелось в виду, что при выходе из блока с помощью goto объекты нормально удаляются... -------------------- qqq |
|||
|
||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
А если вспомнить про немаловажную вещь как Стиль программирования С++?
Правильный и неправильный? goto - неправильный. -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| Mayk |
|
||||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Я повторюсь, но у компиляторов иное мнение на этот счёт (посмотри листинги борлы, вязанки, гнуса. Они далеко не все forы и whileы в луп пихают.
вот отрывок из асма(компилил как g++ -O3 a.cpp)
Добавлено @ 18:19
А если фигурные скобки убрать? © Это сообщение отредактировал(а) Mayk - 27.10.2005, 18:22 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||||
|
|||||||||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
Mayk
Еще раз прошу-аргументы... Кто сказал такое- твой преподаватель, друг , книжники буржуазные? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Допустим, goto полезно использовать внутри одного блока.
Но если начать использовать goto в разных блоках, то результаты непредсказуемы. И вообще я домой. Рабочий день кончился. Вложенный цикл единственное место где полезно использовать goto. В остальных случаях ругайте свои руки, за кривой код. Это сообщение отредактировал(а) Neitron - 27.10.2005, 18:27 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 2 Всего: 62 |
Ладно и я домой.
Пока в goto ничего плохого с точки зрения работы не увидел.. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Любопытно. Автор весьма пристрастен или лукавит. Небольшое изменение в его же коде( is_valid() - лишняя , а create при неудаче выбрасывает исключение) и все становиться весьма прозрачно и лаконично. В том числе и вывод лога. Можно кстати повозиться с темплайтаим и все встанет на свои места
Сравниваем с этим
Выводы делайте сами. -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
меня нельзя отнести к ненавидящим, но попробую предположить, почему goto пытаются использовать поменьше: его проще использовать неправильно деление последовательности операторов на блоки {} лично мне очень помогает, оно позволяет структурировать код, даже необязательно, чтобы был какой-то цикл или условный оператор, создавать маленькие объекты в стеке на очень маленькое время, просто попользоваться и удалить использование оператора goto в принципе позволяет переходить границы этих блоков: выходить и входить в этом он схож с исключениями - те позволяют выходить из блоков и, по многим отзывам, являются далеко не самым хорошо понимаемым элементом C++ только, если выход из блока можно обработать более-менее корректно - просто поудалять объекты, то с несанкционированным входом в блок начинаются проблемы, из-за того, что в отличие от уничтожения объекта способов создания может быть куча... и, пожалуйста, не надо говорить "так не надо использовать goto для прыжком между блоками", потому что по той же логике не стоит делать в класах protected и private вся эволюция средств программирования направлена не только на повышение производительности программиста, но и на уменьшение вероятности ошибок и упрощение их обнаружения Это сообщение отредактировал(а) maxim1000 - 27.10.2005, 18:33 -------------------- qqq |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
В соответствии с упоминавшейся выше RAII функция-член create() тут тоже лишняя. А если её выбросить, то пропадёт неоднозначность в порядке вызовов деструкторов, что было одним из аргументов автора. -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
а вот тут, уважаемый maxim1000, я бы возразил попробовал сделать, то что описал, оказывается, что запрещено пропускать инициализацию объектов с помощью goto... Добавлено @ 18:44 а для выходов из циклов, пожалуй, подходит... -------------------- qqq |
|||
|
||||
| Vyacheslav |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
А Вы не создавайте в цикле
И вот после этого начинаем думать в каких случаях когда удаляется и когда создается А теперь делаем финт ушами
-------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
| nikitao |
|
|||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 1 Всего: 26 |
Лично у меня возникает вопрос почему все книжники так говорят?B ведь не С один в других языках анологично.Все пишут одно и тоже: -это противоречит принципам структурного програмирования -злоупотребление goto может привести к нестабильной работе приложения. Никаких аргументов в доказательство этоих правил не приводится.Это как аксеома програмирования,но это таким не является. Единственной мысолью которая у меня приходит в голову-это то что когда-то давным давно действительно goto(или подобный оператор) по каким то причинам использовать было опасно(к примеру компелятор плохо с ними спровлялся).В результате этого наложили на него табу.Прошло время и из покаления в покаление это табу передавалось,но никто не проверял правдивость этого правила. ЗЫ А с чего все начиналось:c детской игрушки -------------------- Жизнь - печальная штука. |
|||
|
||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Как ни странно, нет Ссылки в тему: Дейкстра, Go To Statement Considered Harmful Дональд Кнут, Structured Programming with Go To
Лишь косвенно, из-за потенциально низкого качества кода с использованием goto. Прямой связи нет. Ну не нужен goto в высокоуровневых языках -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Кстати, вот почему я прекратил спор.
Надеюсь чья это цитата объяснять не нужно -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
почтал я тут и подумал, что goto можно использовать в качестве мягкого exception для упрощенного и, возможно, ускоренного выхода откуда-то...
-------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |