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

    Где 9? Я тут только три вижу, по количеству cleanup-ов. И в чём сложость? Классы эти всего лишь raii обёрткой будут, вообще ни о чём.
    Но вообще в целом да, если ты пишешь программу из 100 строк, то выносить в ней освобождение ресурсов в raii если ты юзаешь сишное api смысла действительно не сильно много.

    Цитата JoeUser @
    Кроме зашкаливающей ненависти к goto я не вижу тут профита.

    А он есть. Как минимум это устойчивость программы к неожиданным исключениями и ошибкам в последующих изменениях.
      Цитата OpenGL @
      А он есть. Как минимум это устойчивость программы к неожиданным исключениями и ошибкам в последующих изменениях.

      Только не здесь! Дело в том, что я ее пилю под API Qt5, а тамошние прогеры не жалуют исключения, более того - советуют про них вааще забыть, если используется Qt. Ну с ними конечно не очень согласен, я вааще ни с кем не согласен, но с ними - больше не согласен! :) Но вынужден внемлить.
        Это всё не отменяет остальное. Ок, исключения ты не юзаешь, но все эти многочисленные goto cleanup в разы более подвержены ошибкам и в разы менее устойчивы, чем нормальное решение.
        Хотя я это уже не раз объяснял, причём даже тебе. Если ты до сих пор задаёшься вопросом, зачем это надо, то смысла вдаваться в подробности не очень много.
          Цитата OpenGL @
          в разы менее устойчивы, чем нормальное решение

          OpenGL, че мы будем переливать из пустого в порожнее? Типа "там это вам не тут". Давай на примере покажи! Вот тебе кусок подобного кода, Всего 49 строк. Трансформируй его, как ты считаешь правильным, и мы вместе с тобой посмотрим?

          ExpandedWrap disabled
            // lv = local value
            // cv = class value
            // r1 .. r3 - захватываемые ресурсы
             
            lv = init1(r1);
            if (lv!=0) {
              err = "err-1";
              goto cleanup1;
            }
            cv1 = init2(r2);
            if (cv1!=0) {
              err = "err-2";
              goto cleanup3;
            }
            lv = init3();
            if (lv!=0) {
              cv1 = -1;
              err = "err-3";
              goto cleanup2;
            }
            cv2 = init4();
            if (cv2!=0) {
              err = "err-4";
              goto cleanup2;
            }
            lv = init5();
            if (lv!=0) {
              err = "err-5";
              goto cleanup3;
            }
            lv = init6(r3);
            if (lv!=0) {
              err = "err-6";
              goto cleanup4;
            }
             
            ....
            ....
            ....
            return;
             
            cleanup4:
            release3(r3);
            cleanup3:
            cv1 = 0;
            cv2 = 0;
            cleanup2:
            release2(r2);
            cleanup1:
            release1(r1);
            Зачем мне как-то трансформировать код, который ты только что придумал специально так, чтобы его было удобно писать именно с goto? :D Он не подобен, т.к. у тебя тут goto cleanup%random% идёт. На практике же такое не встречается, и, в частности, твой оригинальный код прекрасно разруливается через деструкторы.

            Добавлено
            Да и вообще - что ты доказываешь? Если то, что goto иногда полезен, то я с этим тезисом скорее согласен, однако твой код это не доказывает.
              Цитата OpenGL @
              Зачем мне как-то трансформировать код, который ты только что придумал специально так, чтобы его было удобно писать именно с goto? Он не подобен, т.к. у тебя тут goto cleanup%random% идёт. На практике же такое не встречается, и, в частности, твой оригинальный код прекрасно разруливается через деструкторы.

              Добавлено 3 минуты назад
              Да и вообще - что ты доказываешь? Если то, что goto иногда полезен, то я с этим тезисом скорее согласен, однако твой код это не доказывает.

              Ответ на пять! :good: 49 совершенно неправильных строчек - лишили меня дозы адреналина :'( А он, окаянный, так благодатно выделяется как раз в моменты, когда тебя такого самоуверенного тыкают носом в невиданной красоты код. А тут ... опять облом. И уже стандартная аргументация - "никогда такого не было - и вот опять!" (С)

              Добавлено
              Цитата OpenGL @
              однако твой код это не доказывает

              Ну покажи как правильно на моем коде! И моя благодарность будет безгранична в разумных пределах.
                Цитата JoeUser @
                Ну покажи как правильно на моем коде!

                У тебя естественным образом выделяются 3 ресурса, и их освобождение привязано к трём меткам. Сделай создание соответствующих обёрток над ними в нужные моменты (хоть объяви типы руками, хоть так, как Киля показал - пофиг), в моменты, когда что-то идёт не так, делай просто return. А когда ты дошёл до самого конца, просто делай std::move этих ресурсов в поле своего класса.
                  OpenGL, не нужно слов - покажи кодом! Я же все выложил - для копипасты нет пределов. Мне просто хочется тупо сравнить мое говтушное :) , и твое красивое. Сразу предупреждаю - отмазы типа "мне лень" воспринимаются как трамвайный съезд. Как говорят "сказал А - говори и Бэ". Мне нужно сравнить два кода, мой говнявый, и твой эталонный. Не будет кода - разговор закончен, ибо пока это - вода.
                  Скрытый текст
                  Напомню - у нас сайт называется "исходники" а не "водолеи"
                    JoeUser, нормальные посоны написали бы так (если прям нужно без исключений):

                    ExpandedWrap disabled
                      error* init(R1& r1, R2& r2, R3& r3)
                      {
                          LV lv;
                          lv = init1(&r1);
                          if (lv != 0) {
                              return "err-1";
                          }
                          cv1 = init2(&r2);
                          if (cv1 != 0) {
                              return "err-2";
                          }
                          lv = init3();
                          if (lv != 0) {
                              cv1 = -1;
                              return "err-3";
                          }
                          cv2 = init4();
                          if (cv2 != 0) {
                              return "err-4";
                          }
                          lv = init5();
                          if (lv != 0) {
                              return "err-5";
                          }
                          lv = init6(&r3);
                          if (lv != 0) {
                              return "err-6";
                          }
                          return null;
                      }
                       
                      error* init()
                      {
                          R1 r1;
                          R2 r2;
                          R3 r3;
                       
                          error* err = init(&r1, &r2, &r3);
                          if (err != null) {
                              cv1 = 0;
                              cv2 = 0;
                              return err;
                          }
                          ...
                          ...
                          ...
                          return null;
                      }
                    Сообщение отредактировано: korvin -
                      Цитата JoeUser @
                      OpenGL, че мы будем переливать из пустого в порожнее? Типа "там это вам не тут". Давай на примере покажи! Вот тебе кусок подобного кода, Всего 49 строк. Трансформируй его, как ты считаешь правильным, и мы вместе с тобой посмотрим?

                      Если функции которые используются в этом говнокоде реально делают полезную работу, например там - открывают файлы, выделяют память, устанавливают соединие и т.п. То в принципе в этом говнокоде как минимум 3 утечки. Если же они просто возвращают какие то переменные на стеке, то их уничтожать смысла нет.
                      ЗЫЖ
                      ExpandedWrap disabled
                        lv = init1(r1); //! <<<<<<<<<<<<<<<<<<< Выделили память в куче, открыли файл, установили соединение, и т.д.
                        if (lv!=0) {
                          err = "err-1";
                          goto cleanup1;
                        }
                        cv1 = init2(r2);
                        if (cv1!=0) {
                          err = "err-2";
                          goto cleanup3;
                        }
                        lv = init3(); //! <<<<<<<<<<<<<<<<<<<<< плевать что перед этим мы завладели ресурсом, в этом месте мы теряем ранее захваченный ресурс.

                      Ну и т.д. по коду. Ну а если ты всего лишь опечатался и там другие имена переменных, то этот говнокод вполдне себе переписывается в нормальный, качественный код: https://ideone.com/WMrtkA

                      ExpandedWrap disabled
                                    #include <iostream>
                                   #include <memory>
                            
                            
                                    void SomeFunc()
                                    {
                                        auto r1_cleanup = [](int* ptr){
                                            std::cout << "r1_cleanup is called" << std::endl;
                                        };
                            
                                        auto r2_cleanup = [](int* ptr){
                                            std::cout << "r2_cleanup is called" << std::endl;
                                        };
                            
                                        auto r3_cleanup = [](int* ptr){
                                            std::cout << "r3_cleanup is called" << std::endl;
                                        };
                            
                                    auto lv = std::unique_ptr<int, decltype(r1_cleanup)>(new int()/*::init1(...)*/, r1_cleanup);
                                    auto cv1 = std::unique_ptr<int, decltype(r2_cleanup)>(new int()/*::init2(...)*/, r2_cleanup);
                                    auto cv2 = std::unique_ptr<int, decltype(r3_cleanup)>(new int()/*::init3(...)*/, r3_cleanup);
                            
                                /*...*/
                                    }
                            
                                    int main() {
                                        SomeFunc();
                                        return 0;
                                    }
                      Сообщение отредактировано: Wound -
                        Цитата korvin @
                        (если прям нужно без исключений)

                        Неа ...
                        Скрытый текст
                        ExpandedWrap disabled
                          error* init(R1& r1, R2& r2, R3& r3)
                          {
                              LV lv;
                              lv = init1(&r1);
                              if (lv != 0) {
                                  return "err-1";
                              }
                              cv1 = init2(&r2);  
                              if (cv1 != 0) {
                                  return "err-2";
                              }
                              lv = init3();
                              if (lv != 0) {  ◄─── тут случился облом, нужно освободить r1, r2, а cv1=-1, ─┐
                                  cv1 = -1;                                                                │
                                  return "err-3";                                                          │
                              }                                                                            │
                              cv2 = init4();                                                               │
                              if (cv2 != 0) {                                                              │
                                  return "err-4";                                                          │
                              }                                                                            │
                              lv = init5();                                                                │
                              if (lv != 0) {                                                               │
                                  return "err-5";                                                          │
                              }                                                                            │
                              lv = init6(&r3);                                                             │
                              if (lv != 0) {                                                               │
                                  return "err-6";                                                          │
                              }                                                                            │
                              return null;                                                                 │
                          }                                                                                │
                                                                                                           │
                          error* init()                                                                    │
                          {                                                                                │
                              R1 r1;                                                                       │
                              R2 r2;                                                                       │
                              R3 r3;                                                                       │
                                                                                                           │
                              error* err = init(&r1, &r2, &r3);                                            │
                              if (err != null) {                                                           │
                                  cv1 = 0;    ◄───── а ты? ────────────────────────────────────────────────┘
                                  cv2 = 0;
                                  return err;
                              }
                              ...
                              ...
                              ...
                              return null;
                          }


                        Добавлено
                        Цитата Wound @
                        Выделили память в куче,

                        С хера ли "выделили"??? Функция вернула указатель в мою стековую переменную на данные из своих "недр".
                        Цитата Wound @
                        плевать что перед этим мы завладели ресурсом, в этом месте мы теряем ранее захваченный ресурс.

                        Lv - не указатель, а флаг успешности/неуспешности отработки функции Init<номер>. Вааще не теряется, не теряется совсем-совсем! Честное слово!
                        Цитата Wound @
                        в этом говнокоде

                        Ты как чукча, о чем вижу - о том пою! :lool: Киля ты отвечал не на мой код, а на тот, который сам себе придумал - и осудил! (Кстати. Я - тебя поддерживаю!!!)
                          Цитата JoeUser @
                          С хера ли "выделили"??? Функция вернула указатель в мою стековую переменную на данные из своих "недр".

                          Откуда я знаю что эта портянка говнокода, которую ты привел, делает ? Вот это как раз образец нечитаемой херни, которую даже студенты забраковали бы!

                          Цитата JoeUser @
                          Lv - не указатель, а флаг успешности/неуспешности отработки функции Init<номер>. Вааще не теряется, не теряется совсем-совсем! Честное слово!

                          Да ладно? Сурьезно? А скажи ка, что делают функции init3(); init4(); init5(); ? И как ты определил что после неуспешного вызова init3 и init4 нужно сделать goto cleanup2;, а после неуспешного вызова init5 нужно сделать cleanup3 ? Я же говорю, из этого говнокода - ничего не понять, эталон говна, так сказать. Ты его сначало перепиши так, чтоб он хоть както читался и в нем была хоть какая то логика, а потом уже спрашивай как это улучшить.

                          Добавлено
                          Цитата JoeUser @
                          Ты как чукча, о чем вижу - о том пою! :lool: Киля ты отвечал не на мой код, а на тот, который сам себе придумал - и осудил! (Кстати. Я - тебя поддерживаю!!!)

                          Ну так в этом говне что ты привел, кроме тебя наверное никто не разберется, потому как одному тебе понятно как оно работает(на самом деле это дерьмо не будет работать в таком виде, а если его закомитить в прод - то скорее всего вызовут на ковер с возможным увольнением по статье профнепригодность).
                            Цитата JoeUser @
                            Неа ...

                            Что «неа»?

                            Цитата JoeUser @
                            тут случился облом, нужно освободить r1, r2

                            r1, r2 и r3 гарантированно освобождаются при выходе из процедуры init()

                            Цитата JoeUser @
                            а cv1=-1

                            Да пожалуйста
                            ExpandedWrap disabled
                              error* init(R1& r1, R2& r2, R3& r3)
                              {
                                  LV lv;
                                  lv = init1(&r1);
                                  if (lv != 0) {
                                      return "err-1";
                                  }
                                  cv1 = init2(&r2);
                                  if (cv1 != 0) {
                                      set_zero();
                                      return "err-2";
                                  }
                                  lv = init3();
                                  if (lv != 0) {
                                      cv1 = -1;
                                      return "err-3";
                                  }
                                  cv2 = init4();
                                  if (cv2 != 0) {
                                      return "err-4";
                                  }
                                  lv = init5();
                                  if (lv != 0) {
                                      set_zero();
                                      return "err-5";
                                  }
                                  lv = init6(&r3);
                                  if (lv != 0) {
                                      set_zero();
                                      return "err-6";
                                  }
                                  return null;
                              }
                               
                              error* init()
                              {
                                  R1 r1;
                                  R2 r2;
                                  R3 r3;
                               
                                  error* err = init(&r1, &r2, &r3);
                                  if (err != null) {
                                      return err;
                                  }
                                  ...
                                  ...
                                  ...
                                  return null;
                              }
                               
                              void set_zero()
                              {
                                  cv1 = 0;
                                  cv2 = 0;
                              }
                            Сообщение отредактировано: korvin -
                              Цитата JoeUser @
                              Киля ты отвечал не на мой код, а на тот, который сам себе придумал - и осудил!

                              К слову мой пример подходит даже к тому говнокоду, который ты сам себе придумал, и который возможно я даже не так понял.
                              Тебе бы почитать про RAII - основного кита С++, может быть малеха умнее стал, но судя по уровню приведенного кода - я даже не знаю, поймешь ли ты основную идею этой идеологии. :-?
                              На самом деле что предыдущий пример что этот - это как раз реализация RAII в чистом виде, unique_ptr - нужен лишь с единственной целью, чтоб не плодить классы, в него очень удобно оборачивать сишные функции, которые завладевают ресурсами и которые в последствии необходимо освободить.
                              Какой профит от этого? Профит в том, что теперь тебе не нужно думать когда и в каком месте надо вызвать goto или cleanup, ресурс сам знает когда должен уничтожится и управляет временем его жизни и освобождением ресурсов - язык. А значит это более надежнее.
                              Сообщение отредактировано: Wound -
                                Цитата Wound @
                                Откуда я знаю что эта портянка говнокода, которую ты привел, делает ?

                                Вот это самый важный вопрос!!! "Откуда я знаю что эта портянка говнокода, которую ты привел, делает ?" - но советую! Ты - кросава!!! :lool: Киля, запомни, и расскажи всем родным и близким - "диавол кроется в мелочах"!

                                Цитата Wound @
                                эталон говна, так сказать

                                Ошибаешься, это - эталон эталонов говна! Ну бывают такие взаимосвязи в состояниях систем, что да - хочется срать говном. Но если на кону зарплата/гонорар - засунь себе уникальный поинтер в жопу, но просто сделай, чтобы работало.

                                Цитата Wound @
                                Ну так в этом говне что ты привел, кроме тебя наверное никто не разберется, потому как одному тебе понятно как оно работает

                                И это все потому, что - Я ЛУЧШИЙ в говне!

                                Цитата Wound @
                                то скорее всего вызовут на ковер с возможным увольнением по статье профнепригодность

                                Я уже 10 лет работаю сам на себя. Максимум - расстреляют, но я не лезу в политику, не митингую. Ну если только изредка, устраиваю молчаливый пикет с вискарем - дома 8-) Мечтаю съездить в Париж, поссать с Эйфелефой башни, ибо построить такую мне мешает Путин!

                                Добавлено
                                korvin, завтра повникаю ... а пока обоснуй - почему в твоем коде 56 строк, а в моем 49 - и ты что, качество "построчно" оцениваешь? Нахрена раздул код?!! :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (32) « Первая ... 18 19 [20] 21 22 ...  31 32


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