Кресты / Говнокод #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 Elvenfighter, (Updated )

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

  • научить их функциональному погроммирванию? или экстракт метод делать?
    Ответить
      • Рассказал, проверь:
        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 это не последний элемент, они просто пропускаются.

                  Какай ансикл )))
                  Ответить
        • Переписа́л на «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 строк кода
              }
            }
            Ответить
              • Существует и 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;
                }


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

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

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

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

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

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

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

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

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


                          Кто найдет проблему, тому -- ничего.
                          Ответить
                            • потому что ты получаешь количество записей в списке ключей и там внутри испо итератор
                              Ответить
                              • > там внутри испо итератор
                                Именно поэтому я за «чистые функции».
                                Ответить
  • Просто в крестах нету fitler именно поэтому я за "Python".
    Ответить
      • Я не знаю что такое "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 строк кода
      }
      Ответить
        • Пытался реализовать макрос через 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 left-pad@1.3.0: use String.prototype.padStart()
    Ответить
  • Котаны, как построить дугу на сфере, зная центр сферы и начальную и конечную точку? Найти угол, используя векторы, как я понимаю, элементарно. А дальше что? На двухмерной поверхности это несложно, а в 3D?
    Ответить
    • По трём точкам ты можешь построить плоскость. Задача сводится к 2D: в плоскости по этим точкам построить дугу ты сможешь.
      Ответить
      • Если говорить в терминах opengl, то главное это правильно посчитать угол, на который нужно повернуть "плоскость"?
        Ответить
    • Переносим начало координат в центр сферы для удобства. Перебираем точки на отрезке между А и Б. Далее нужно точку отнормировать так, чтобы она лежала на сфере, для этого делим на длину и умножаем на радиус.
      Ответить
      • А и вправду. Спасибо.

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

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

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8