1. C++ / Говнокод #25772

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    for (const auto& item : items)
    {
      if (!item.isValid())
        continue;
      else
      {
        // 200 строк кода
      }
    }

    Что делать с такими колегами?

    Запостил: Elvenfighter, 21 Августа 2019

    Комментарии (95) RSS

    • научить их функциональному погроммирванию? или экстракт метод делать?
      Ответить
      • Рассказать им про goto.
        Ответить
        • Рассказал, проверь:
          for (const auto& item : items)
          {
            if (!item.isValid())
              goto skip;
            else
            {
              // 200 строк кода
            }
            skip:
          }
          Ответить
          • а перепиши пожалуйста без этого мерзкого for, чтобы всё было на goto
            Ответить
            • Перевёл, проверь.
              auto it = items.cbegin();
              if (it == items.cend())
                  goto doopa;
              loopa:
              {
                  const auto & item = *it;
                  if (!item.isValid())
                      goto loopadoopa;
                  else
                  {
                    // 200 строк кода
                  }
              
              loopadoopa:
                  ++it;
                  if (it != items.cend())
                      goto loopa;
              }
              doopa:
              Ответить
              • а почему зеленым? Вполне нормальный код с итератором и goto.
                Ответить
              • Сократил код, проверь:
                auto it = items.cbegin();
                zaloopa:
                if (it == items.cend())
                    goto doopa;
                loopa:
                {
                    const auto & item = *it;
                    if (!item.isValid())
                        goto loopadoopa;
                    else
                    {
                      // 200 строк кода
                    }
                
                loopadoopa:
                    ++it;
                    goto zaloopa;
                }
                doopa:
                Ответить
                • Перепиши пожалуйста на plain c89.

                  * выводов типов нет (никаких autor)
                  * итератор это просто поинтер (++ двигает его дальше, * разыменовывает). Последний элемент указывает на NULL (вместо isValid()

                  спасибо
                  Ответить
                  • > выводов типов нет
                    Тип содержимого items неизвестен, перевести нельзя.
                    Ответить
                  • Ващета !isValid это не последний элемент, они просто пропускаются.

                    Какай ансикл )))
                    Ответить
        • >auto& item
          Рассказать им про «PHP».
          Ответить
          • Переписа́л на «PHP»:
            <?php
            foreach ($items as $item)
            {
              if (!$item->isValid())
                continue;
              else
              {
                // 200 строк кода
              }
            }

            Совсем другое дело!
            Ответить
            • Сейчас JS мейнстрим, PHP -- для хипстеров:
              for (item in items) {
                if (!items.hasOwnProperty(item))
                  continue;
              
                if (!item.isValid())
                  continue;
                else {
                  // 200 строк кода
                }
              }
              Ответить
              • Именно поэтому я за «PHP».
                Ответить
              • не in, а of
                Ответить
                • Ещё всякие ичи и форичи вспомните.
                  Ответить
                • Существует и in, и of.

                  1. of существует только в ES6, поэтому не поддерживается старыми браузерами.

                  2. in существует давно, но перечисляет не индексы массива, а все свойства объекта, включая встроенные, унаследованные от базового объекта, поэтому всё это лишнее дерьмо приходится отфильтровывать с помощью hasOwnProperty.

                  3. Метод forEach существует лишь для некоторых объектов: Array.prototype.forEach(), Map.prototype.forEach(), Set.prototype.forEach().

                  3а. Довольно популярный объект NodeList, имеющий отношение к DOM, это не массив, а неведомая хрень, реализующая интерфейс массива лишь частично, поэтому в большинстве браузеров метод NodeList.prototype.forEach() отсутствует (на текущий момент NodeList.prototype.forEach() реализовали только в «Webkit», что привело к появлению сайтов, работающих только в «Хроме» и в его клонах).

                  Кстати, грубый хак:
                  if (window.NodeList && !NodeList.prototype.forEach) {
                      NodeList.prototype.forEach = Array.prototype.forEach;
                  }


                  Ничего не забыл?
                  Ответить
                  • > NodeList
                    Кстати, они этот "DOM" с жабы спиздили?
                    Ответить
                    • «DOM Level 1» опубликовали после выхода в свет «Rhino», который был написан на жабе.
                      Ответить
                      • > Rhino
                        Т.е. джаваскрипт это всё-таки скрипт для джавы.
                        Ответить
                        • Тогда думали, что программисты будут писа́ть на «Java», а операторы шаблонизатора будут склеивать этот код простеньким скриптом. Однако, серверный вариант их «простенького скрипта» двадцать лет назад почему-то не прижился, да и из браузеров апплеты постепенно исчезли.

                          Кстати, был веб-браузер «Hotjava», целиком написанный на «Java». Он полностью поддерживал «HTML3», в который входили элементы, которые пото́м удалили из «HTML» и перенесли в «MathML» и в «SVG» (не совсем точно, у некоторых элементов поменялись названия и синтаксис, но общая идея такая).
                          Ответить
                        • Офтопик: я видел сайт, на котором висел жабоапплет с Jython'ом, чтобы в качестве скриптового языка можно было использовать «Python».
                          Ответить
                      • Rhinho
                        Ответить
                  • В целом всё так.

                    Изначально был только "in": он возвращал ключи(филды и методы).
                    Так как Array это просто object, то возвращались там length и прочая хуита, и итерироваться так было нельзя.

                    нужно было явно брать length и делать обычный сишный for:
                    for(var i = 0; i < petuh.length; i++)

                    В какой-то момент завезли "of" и теперь по массиву можно ходить через of.
                    Спутать of и in -- любимая ошибка несчастного программиста, волею судеб занесенного в джаваскрипт парашу.

                    forEach (и некоторые другие методы вроде map) были завезены в Array, но не в любой итерируемый тип. Кирипичи по поводу того, что из коробки нельзя вызвать forEach у обычного итератора, уже были неоднократно отложены на говнокоде.
                    Приходится преобразовывать в моссив
                    Ответить
                    • Именно поэтому я за «PHP».
                      Ответить
                    • >> Приходится преобразовывать в моссив

                      Можно написа́ть Pituh.prototype.forEach = Array.prototype.forEach; и течь.

                      Хвала прототипному погромированию!
                      Ответить
                    • Идите на хуйло, for in с массивами это вообще сраная квиркота, даже вебмакаки понимают, что ошибка
                      Аггау.ргототуре.русНя.са11
                      Ответить
                      • хуипка

                        в каком прекрасном языке у тебя еще есть такая подстава?
                        Ответить
                        • В других языках другие подставы:
                          http://blogs.perl.org/users/rurban/2014/04/do-not-use-each.html
                          Ответить
                          • >If you add or delete a hash's elements while iterating over it,
                            ну охуеть теперь, давайте менять стейт у стейтфулного итератора

                            попробуй сделать это в жабе или в шарпе
                            познамишься с ConcurrentModificationException

                            >Not re-entrant
                            типа нельзя итерируясь по хешу итернуться по тому же эешу?
                            итератор один на хеш?
                            ох, мама, лол
                            Ответить
                            • В «PHP» тоже есть функция each, у которой один глобальный итератор на каждый массив. При этом можно спокойно использовать вложенные foreach (у них итераторы локальны) и вложенные array_map/array_walk.

                              Именно поэтому я против «each».
                              Ответить
                              • питониста твоих проблем не понимать
                                users = ["сослик", "услик", "паукан"]
                                for u in users:
                                     for u2 in users:
                                             if u2 != u:
                                                     print(f"{u} -- {u2}")


                                сослик -- услик
                                сослик -- паукан
                                услик -- сослик
                                услик -- паукан
                                паукан -- сослик
                                паукан -- услик
                                Ответить
                                • Перевёл с минимальными правками, проверь:
                                  <?php
                                  $users = ["сослик", "услик", "паукан"];
                                  foreach($users as $u):
                                       foreach($users as $u2):
                                               if($u2 != $u):
                                                       print("${u} -- ${u2}\n");
                                               endif;
                                       endforeach;
                                  endforeach;

                                  http://ideone.com/8DnET3

                                  Просто не надо пользоваться устаревшим говном типа «each», которое за каким-то чёртом вытащили из «Перла».

                                  Вот зачем функция each в «PHP»?
                                  Ответить
                                • Благодаря тебе я узнал о Михаиле Яснове –— великом кобенаторе и мастере вореций:
                                  https://deti-i-knigi.livejournal.com/19709.html
                                  https://deti-i-knigi.livejournal.com/17225.html
                                  Ответить
                                  • https://ic.pics.livejournal.com/deti_i_knigi/68952318/174998/174998_600.jpg


                                    Помоги тогда отгодать букву "В"
                                    Ответить
                                    • Если бы не отгадка в «подвале», я бы ни за что не догадался.
                                      Ответить
                                      • Я в какой-то момент подумал, что загадка про Конардо
                                        Ответить
                                        • Про Х тоже хорошая загадка
                                          Тут и без подвала понятно
                                          https://ic.pics.livejournal.com/deti_i_knigi/68952318/175530/175530_original.jpg
                                          Ответить
                                          • Это загадка про нашего луашника? Или про автора языка программирования «J»?
                                            Ответить
                                            • Как ты думаешь, когда взрослый мужик пишет загадку про "Х" который "всё знает" и песенку про "мокренькую кисоньку" -- он шутит, или нет?
                                              Ответить
                                            • Бля, я тоже о них подумал (((
                                              Ответить
                                        • Я тоже. «Говнокод» разрушил мой и без того небольшой мозг.
                                          Ответить
                                    • То есть на букву "Г" - вообще изи?
                                      Ответить
                                      • Да, это же очевидно.

                                        Надо еще придумать смешную загадку про подкладку куртки, или про загубник от трубки
                                        Ответить
                          • стрелок везде ногу найдет
                            Ответить
                          • То такое, цветочки. Вот настоящий "вротмненоги":
                            my $i = 0;
                            for (my ($key, $value) = each %hash) {
                              printf("%s of %s: %s => %s\n", $i, scalar keys %hash, $key, $value);
                              $i += 1;
                            }


                            Кто найдет проблему, тому -- ничего.
                            Ответить
                            • Вызов scalar keys почему-то сбивает итератор.
                              Ответить
                              • потому что ты получаешь количество записей в списке ключей и там внутри испо итератор
                                Ответить
                                • > там внутри испо итератор
                                  Именно поэтому я за «чистые функции».
                                  Ответить
              • Ты забыл else после первого условия.
                Ответить
          • Расскажи им про "кобе".
            Ответить
    • Я бы просто убрал else. Остальное норм же.
      Ответить
      • Именно о том и речь. Там еще внизу несколько уровней вложености, а форматтер дерзко коцает все, что в длинну больше 100 символов.
        Ответить
        • > а форматтер дерзко коцает все, что в длинну больше 100 символов.

          Именно поэтому я за "Notepad++".
          Ответить
          • ой-ой, думаешь спрятался?

            https://weekly-geekly.github.io/articles/457972/index.html
            Ответить
    • Просто в крестах нету fitler именно поэтому я за "Python".
      Ответить
      • boost.iterators могут помочь?
        Ответить
        • Я не знаю что такое "boobs.iterators". В "PHP" ничего этого нет. Именно поэтому я за "PHP".
          Ответить
      • > Просто в крестах нету fitler

        В boost все есть: https://www.boost.org/doc/libs/1_52_0/libs/range/doc/html/range/reference/adaptors/reference/filtered.html

        А в С++20 будет и в стандарте (вместе с новыми "приколами" из-за ленивого вычисления).

        Но тут не в том говно. Код вполне читаемый, там filter как пятое колесо будет (на "выебнуться").
        Ответить
      • Вот тебе "fitler":
        #define FITLER(cond) if(!(cond))continue;else
        
        for (const auto& item : items) FITLER(item.isValid())
        {
          // 200 строк кода
        }
        Ответить
        • Гениально!
          Переведи на «PHP».
          Ответить
          • Пытался реализовать макрос через include, но оказалось, что include требует, чтобы во включаемом файле был полный код. Какой багор )))

            Тогда так:
            <?php
            
            class Item {
             private $data;
             public function __construct ($value) {$this->data = $value;}
             public function __toString() {return strval($this->data);}
             public function isValid() {return $this->data != 666;}
            }
            
            function foreach_with_fitler($array, $iterator, $body, $fitler) {
              @array_walk(array_filter($array, $fitler), function($item, $key)use($iterator, $body){
                $$iterator = $key;
                eval($body);
              });
            }
            
            $items = array(new Item(13), new Item(265), new Item(666), new Item(1488));
            
            define('FITLER', 'FITLER');
            
            function FITLER($value) {return $value->isValid();}
            
            foreach_with_fitler($items, '$item', 'echo $item . PHP_EOL;', FITLER);


            http://ideone.com/4bsI7j
            Ответить
            • $FILTER = 'if';
               
              eval(<<<PHP
                  foreach (\$items as \$item) $FILTER (\$item->isValid())
                  {
                  	echo \$item . PHP_EOL;
                  }
              PHP);
              Ответить
        • Какой скилл )))
          Ответить
    • for (var item in items.Where(i => i.isValid()) 
      {
        // Я хотел было сказать: «Голову им оторвать!», но вспомнил, что в прошлый 
        // раз как-то неудобно получилось, и передумал, не стал такого кричать.
      }
      Ответить
    • ахахахахахахахаха
      npm WARN deprecated [email protected]: use String.prototype.padStart()
      Ответить
    • Котаны, как построить дугу на сфере, зная центр сферы и начальную и конечную точку? Найти угол, используя векторы, как я понимаю, элементарно. А дальше что? На двухмерной поверхности это несложно, а в 3D?
      Ответить
      • По трём точкам ты можешь построить плоскость. Задача сводится к 2D: в плоскости по этим точкам построить дугу ты сможешь.
        Ответить
        • Если говорить в терминах opengl, то главное это правильно посчитать угол, на который нужно повернуть "плоскость"?
          Ответить
      • Переносим начало координат в центр сферы для удобства. Перебираем точки на отрезке между А и Б. Далее нужно точку отнормировать так, чтобы она лежала на сфере, для этого делим на длину и умножаем на радиус.
        Ответить
        • А и вправду. Спасибо.

          По сути тот же принцип, что и при построении сферы через октаэдр
          Ответить
    • items.select(&:isValid).each do |item|
        # 200 строк кода
      end

      Именно поэтому я за Ruby
      Ответить

    Добавить комментарий