На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (32) « Первая ... 3 4 [5] 6 7 ...  31 32  ( Перейти к последнему сообщению )  
> goto vs break & continue , Кроха-сын пришел к отцу и спросила кроха: "goto - это хорошо?"
    Цитата D_KEY @
    Так не для этого городить надо. Идиома RAII тем хороша, что ты с одной стороны, знаешь, когда и что произойдет, а с другой - не делаешь это руками, т.к. все происходит в автоматическом режиме. На этом фоне даже finally выглядит костылем, а ты про goto...
    Не-не-не. Я не спорю. RAII - это отличная штука. Я ей постоянно пользуюсь. Я к тому, что глупо категорично заявлять, что goto никогда не надо использовать. Иногда, очень редко, goto оказывается проще, быстрее и понятнее, чем что-либо другое.
    Сообщение отредактировано: applegame -
      Цитата applegame @
      Иногда, очень редко, goto оказывается проще, быстрее и понятнее, чем что-либо другое

      Конкретный пример в студию.
        Цитата michspar @
        Конкретный пример в студию.
        Был выше. Но похоже некоторым нравится дописывать еще десяток строк, лишь бы не нарушать табу.
        Почитайте: http://habrahabr.ru/post/114211/
        Сообщение отредактировано: applegame -
          Цитата applegame @
          Да-да. Всё околоайтишное говницо со всего СНГ оседает именно на хабре.

          На самом деле даже в том рафинированном примере, будь A, B, C, D, E более одной строчки, или как там написано:
          Цитата
          это некоторые операции, а не вызов функции! Вполне возможно, что они используют массу локальных переменных. И вполне возможно, что они меняют их состояние.
          Даже тот вырвиглазный ужос во втором примере будет более понятен, нежели неизвестно куда ведущие goto. Закручивающие в циклы и ветвления (ветвлениz прямо во внутрь цикла sic!), по неочевидным (а после того, как код перестанет быть тривиальным -- так и вообще не понятным) условиям, которые через месяц не сможет разобрать даже их автор.
            Цитата Повстанець @
            Даже тот вырвиглазный ужос во втором примере будет более понятен, нежели неизвестно куда ведущие goto. Закручивающие в циклы и ветвления (ветвлениz прямо во внутрь цикла sic!), по неочевидным (а после того, как код перестанет быть тривиальным -- так и вообще не понятным) условиям, которые через месяц не сможет разобрать даже их автор.

            Зачем рыть себе могилу? Ты просто накладываешь на использование goto шаблон, по которому этот код у тебя обязательно разрастется до более чем 1 строчки, и станет до жути не понятным и запутанным. Так ты просто не юзай в этих местах goto. Юзай его там, где он не будет усложнять логику и запутывать программиста.
            А то как послушаешь так на словах все такие рассякие, у всех функции не больше 80 строк, ни у кого нет вложенных циклов, ни у кого нет костыльных dynamic/static/reinterped/const кастов. У всех все просто кульно и круто. А на деле, практически любой код содержит в себе запутанные места, вложенные циклы, либо переизбыток функций в классах, всякие магические касты, непонятные и запутанные алгоритмы и т.д.
            Сообщение отредактировано: KILLER -
              Цитата KILLER @
              Зачем рыть себе могилу? Ты просто накладываешь на использование goto шаблон, по которому этот код у тебя обязательно разрастется до более чем 1 строчки, и станет до жути не понятным и запутанным. Так ты просто не юзай в этих местох goto. Юзай его там, где он не будет усложнять логику и запутывать программиста.
              Это не мой пример, а того чудака с хабра. Я даже знаю как он его придумывал:

              Сидит, значит, надо мол что то изообразить. Нарисовал схему. Не, не получается не обойтись без goto. Добавил ещё блоков, ч0рт -- опять не получается. Добавил стрелочик... та ну ёшкин кот... снова не то. И так пока совсем что то вырвиглазного не вышло.
              Сообщение отредактировано: Повстанець -
                А то вон, помню один в тематике написал типа:
                ExpandedWrap disabled
                  some_value SomeFunc(bool bFlag)
                  {
                     switch(bFlag)
                     {
                        case true:
                           ...
                        break;
                        case false:
                           ...
                        break;
                     }
                  }

                Ну вообще как красиво и понятно все... Так и напрашивается default сюда :D

                Добавлено
                Цитата Повстанець @
                Это не мой пример, а того чудака с хабра. Я даже знаю как он его придумывал:

                Сидит, значит, надо мол что то изообразить. Нарисовал схему. Не, не получается не обойтись без goto. Добавил ещё блоков, ч0рт -- опять не получается. Добавил стрелочик... та ну ёшкин кот... снова не то. И так пока совсем что то вырвиглазного не вышло.

                Не, я к тому, что не стоит так категорично относится к goto, в некоторых случаях он всетаки полезен и не запутывает, а юзать его с целью запутать программиста - ну так это уже ССЗБ.
                  Цитата applegame @
                  Был выше.

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

                  Так я тоже писал, как его правильно реализовывать надо. И это не костыль для обохода goto. Это разделение частей кода на логические части.
                    Цитата applegame @

                    Читал. Автор предлагает (синтетическую, кстати) схему:
                    user posted image
                    реализовать с помощью goto вот так:
                    ExpandedWrap disabled
                      if (a)
                      {
                          A;
                          goto L3;
                      }
                      L1:
                      if (b)
                      {
                      L2:
                          B;
                      L3:
                          C;
                          goto L1;
                      }
                      else if (!c)
                      {
                          D;
                          goto L2;
                      }
                      E;


                    Но, во избежание goto, приводит какой-то монструозный вариант (который я тут даже показывать не хочу), вместо того, чтобы приложить мозг и родить хотя бы что-нибудь такое:
                    ExpandedWrap disabled
                      bool a, b, c;
                       
                      if ( a )
                      {
                          A();
                          C();
                      }
                       
                      do
                      {
                          while ( b )
                          {
                              B();
                              C();
                          }
                       
                          if ( c )
                              break;
                       
                          D();
                          B();
                          C();
                      } while ( true );
                       
                      E();

                    И тут (внезапно) выясняется, что в этом алгоритме два цикла, один вложеный в другой. А если ещё и добавить контекста, то полюбому получится, что задачу можно решить, разложив алгоритм на подалгоритмы, чтобы такая безумная схема не понадобилась в принципе. Goto действительно легче. Для того, кто пишет, потому что позволяет сериализовывать мысли в код с минимумом усилий. Как правильно тут уже упоминали, такой код - это write only код и в продакшене нам такой код не нужен :no:
                    Сообщение отредактировано: michspar -
                      michspar, ваш пример скопипастен из того же холивара на хабре, там же читайте возражения. :)

                      Добавлено
                      Цитата Повстанець @
                      Да-да. Всё околоайтишное говницо со всего СНГ оседает именно на хабре.
                      Отличная аргументация.
                      Сообщение отредактировано: applegame -
                        Цитата applegame @
                        Просто ахренительная аргументация.
                        Что могу сказать? Какие аргументы, такие и контраргументы. :-?
                          Цитата Повстанець @
                          Что могу сказать? Какие аргументы, такие и контраргументы. :-?
                          Откровенная ложь с честными глазами.
                          Сообщение отредактировано: applegame -
                            Цитата applegame @
                            ваш пример скопипастен из того же холивара на хабре

                            Глубоко не вчитывался. Честно выдумал находу. Нечего возразить? Так и запишем.
                              Цитата michspar @
                              Так я тоже писал, как его правильно реализовывать надо. И это не костыль для обохода goto. Это разделение частей кода на логические части.
                              Иногда такое разделение только ухудшает читабельность кода. Собственно тут повторяются аргументы из комментов статьи на хабре.

                              Добавлено
                              Цитата michspar @
                              Нечего возразить? Так и запишем.
                              Вы товарищ, похоже сам с собой разговариваете. :D

                              Добавлено
                              А по существу, ваши A(), B() и.т.п. могут требовать доступ к неким локальным переменным. И что теперь каждый раз их передавать внутрь этих функций? Отличное решение и, главное, такое прозрачное.
                                Вот неотвеченый пример из конца того же холивара:
                                ExpandedWrap disabled
                                          public int[,] ReadByCoil( out int npts )
                                          {
                                              int[,] res = null;
                                              npts = 0;
                                              if ( m_curArea != 0 ) goto _1;
                                          _2:
                                              if ( !StartNewSect() ) return null;
                                          _1:
                                              res = ReadCoil();
                                              if ( res == null ) goto _2;
                                              npts = m_npt;
                                              return res;
                                          }

                                Очевидно же:
                                ExpandedWrap disabled
                                          public int[,] ReadByCoil( out int npts )
                                          {
                                              int[,] res = null;
                                   
                                              npts = 0;
                                   
                                              if ( m_curArea == 0 && !StartNewSect() ) return null;
                                   
                                              res = ReadCoil();
                                   
                                              if ( res == null ) goto _2;
                                   
                                              npts = m_npt;
                                   
                                              return res;
                                          }


                                Добавлено
                                Цитата applegame @
                                ваши A(), B() и.т.п. могут требовать доступ к неким локальным переменным...

                                Цитата michspar @
                                если ещё и добавить контекста, то полюбому получится, что задачу можно решить, разложив алгоритм на подалгоритмы, чтобы такая безумная схема не понадобилась в принципе
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (32) « Первая ... 3 4 [5] 6 7 ...  31 32


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0587 ]   [ 15 queries used ]   [ Generated: 7.05.24, 10:40 GMT ]