На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS

Поздравляем всех студентов и Татьян с Татьяниным днём!




msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (32) 1 [2] 3 4 ...  31 32  ( Перейти к последнему сообщению )  
> goto vs break & continue , Кроха-сын пришел к отцу и спросила кроха: "goto - это хорошо?"
    :facepalm:

    Сообщения были разделены в тему "goto vs break & continue"

    Это сообщение было перенесено сюда или объединено из темы "Новый стандарт C++: C++1x"
      Иногда goto вполне себе хорош. Была ситуация, когда в относительно длинной функции в нескольких местах надо было прервать выполнение, сделать несколько операций и выйти из функции. Наиболее простым и понятным вариантом оказался вариант с goto:
      ExpandedWrap disabled
        int foo() {
          ...
          goto end;
          ...
          goto end;
          ...
          goto end;
          ...
          end:
          ...
          return;
        }
      Попытки написать тоже самое структурно приводят к кучам бесполезных и плохо читаемых блоков, проверок и т.п.
      Так что goto иногда можно и должно применять. Религиозные фанатики идут лесом.
        Не в c++ то же самое можно сделать через try/finally.
          Цитата OpenGL @
          Не в c++ то же самое можно сделать через try/finally.

          В С++ нет finally(и правильно). Так что RAII - наше все :)
            Ну да, я читал в D&E о причинах его отсутствия. Но у меня не всегда получается сделать подобную вещь без goto/finally :)
              Цитата applegame @
              int foo() {
              ...
              goto end;
              ...
              goto end;
              ...
              goto end;
              ...
              end:
              ...
              return;
              }

              В нормальном коде для таких целей используются деструкторы классов. Или у тебя хендлы и указатели все в сыром виде?

              Добавлено
              Цитата applegame @
              в нескольких местах надо было прервать выполнение, сделать несколько операций и выйти из функции.

              Или, как вариант конкретно в этом случае, оформить эти несколько операций отдельной функцией.
                Цитата OpenGL @
                Ну да, я читал в D&E о причинах его отсутствия. Но у меня не всегда получается сделать подобную вещь без goto/finally :)

                А примерчик можешь привести?

                Добавлено
                Цитата Pacific @
                В нормальном коде для таких целей используются деструкторы классов. Или у тебя хендлы и указатели все в сыром виде?

                А если pure C?
                Различные компиляторы предлагают свои средства(вроде cleanup-атрибута в gcc), но переносимого средства нет.
                Хотя есть разные либы для С, реализующие в том числе и С++-style SEH.
                Сообщение отредактировано: D_KEY -
                  Цитата OpenGL @
                  Не в c++ то же самое можно сделать через try/finally.

                  AFAIK, это заметно дороже, чем Go to
                    Цитата D_KEY @
                    А примерчик можешь привести?
                    Сейчас сходу нет. Давно это было, а в текущем проекте все нормально в этом плане. Вспомню/найду - выложу.

                    Добавлено
                    Цитата korvin @
                    AFAIK, это заметно дороже, чем Go to

                    Ну да. Просто меня в свое время удивило, что при выпрыгивании return-ом в этом случае finally тоже выполнится.
                      Цитата applegame @
                      Иногда goto вполне себе хорош. Была ситуация, когда в относительно длинной функции в нескольких местах надо было прервать выполнение, сделать несколько операций и выйти из функции. Наиболее простым и понятным вариантом оказался вариант с goto:
                      ExpandedWrap disabled
                        int foo() {
                          ...
                          goto end;
                          ...
                          goto end;
                          ...
                          goto end;
                          ...
                          end:
                          ...
                          return;
                        }
                      Попытки написать тоже самое структурно приводят к кучам бесполезных и плохо читаемых блоков, проверок и т.п.
                      Так что goto иногда можно и должно применять. Религиозные фанатики идут лесом.

                      ExpandedWrap disabled
                        int foo()
                        {
                          ...
                          //goto end;
                          return end();
                          ...
                          //goto end;
                          return end();
                          ...
                          //goto end;
                          return end();
                          ...
                          //end:
                          return end();
                        }
                         
                        int end()
                        {
                          ...
                          return ...;
                        }
                        Отдельной функции могут требоваться локальные переменные foo, и их придется передавать в параметрах. По-моему, это неудобно :)
                          Цитата
                          Код нечитабельным делают не сами операторы, а контекст их использования.

                          Любой оператор есть goto. Следовательно, заменив все конструкции структурного программирования на лежащий в их основе goto мы должны снова получить читабельный код. Но пожалуй увы :) Так что я бы сказал более высокоуровневые операторы делают код более читабельным, если применяются в подходящем контексте.

                          Цитата B.V. @
                          Ага. Только не сам по себе, а кривыми руками программиста.

                          Вот к примеру код в стиле передачи продолжений, даже очень аккуратно написанный, так ли уж понятен? Хотя там и операторов как таковых особо и нет.
                          Наверно, код делает сложным в первую очередь его логика управления, запутанный поток выполнения, не очевидные побочные эффекты и т.п.
                            Цитата OpenGL @
                            Отдельной функции могут требоваться локальные переменные foo, и их придется передавать в параметрах. По-моему, это неудобно
                            Это следует понимать: "функции с аргументами принципиально не использую - неудобно"?
                              Цитата OpenGL @
                              Отдельной функции могут требоваться локальные переменные foo, и их придется передавать в параметрах. По-моему, это неудобно :)

                              Можно захватить.
                                Цитата Adil @
                                Это следует понимать: "функции с аргументами принципиально не использую - неудобно"?
                                Нет, это следует понимать как то, что если потребуется изменить end и при этом ей станет необходимо больше/меньше параметров, то придется изменять ее объявление и вызов. Понятно, что средства рефакторинга это сделают одновременно, но зачем, если проще и наглядней через goto/деструкторы? Кроме того, если функция не возвращает значение, то этот способ не прокатит.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (32) 1 [2] 3 4 ...  31 32


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0462 ]   [ 15 queries used ]   [ Generated: 27.01.23, 01:35 GMT ]