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

    +168

    1. 1
    2. 2
    3. 3
    4. 4
    #define loopv(v)    for(int i = 0; i<(v).length(); i++)
    #define loopvj(v)   for(int j = 0; j<(v).length(); j++)
    #define loopvk(v)   for(int k = 0; k<(v).length(); k++)
    #define loopvrev(v) for(int i = (v).length()-1; i>=0; i--)

    Может я чего недопонимаю?
    Это из Cube 2: Sauerbraten

    Запостил: Werdn, 23 Октября 2010

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

    • Ъ-Си стайл
      Ответить
    • ИМХО имеет смысл только первый и последний.
      Остальные, возможно, временный костыль, который забыли выпилить.
      Ответить
      • чем сложно вписать человеческие циклы в коде и не плодить невесть что?
        Ответить
        • Может, хотели абстрагироваться от способа хранения?
          Например, если реализовать в виде списка, то меняется одна строка на что-то вроде:
          for(list_elem* i=v; i; i=i->next)
          Ответить
          • смешно же, городить костыли вместо того чтобы сразу взять язык с соответствующим рангом полиморфизма
            Ответить
            • Ну, мало ли. Может, начальство не дает брать другой язык (как у нас). И вообще, чего мы хотим от игры с таким названием!
              Ответить
              • Cube 2 — где там начальство?
                зато макросов там море, некоторые решают задачу через «жпоа»
                например генерируется уникальное имя для функции некоторой команды в скриптовом языке при помощи номера строки вызова макроса. Следовательно в разных файлах нельзя объявлять эти самые команды.
                Сам не шибко силен в с++, но там выстроена иерархия структур с функциями внутрях (отчего не классы — может так и лучше, не знаю).
                И еще много разного, от чего я думаю что я точно идиот.
                Ответить
                • Ну, инвесторы, или кто там кроме начальства:) Лиды.

                  Это надо у них спросить, чего они извращаются. Может, и объяснят!
                  Ответить
                  • там никого нет. игру разрабатывают 4, может 5 человек.
                    Ответить
            • например Haskell?
              Ответить
          • итераторы в массы
            Ответить
            • идея в теории хороша, но не все шарят в итераторах, в том смысле, что в комманде должна быть небольшая дисперсия по знаниям, иначе кирдык
              Ответить
              • Значит надо сделать несколько команд. А то получается что стадо бежит со скоростью самого медленного.
                Ответить
      • остальные по-ходу для Вложенных циклов...
        Ответить
    • Использование #define там где без него можно обойтись - злейшее зло.
      Ответить
      • Вообще, препроцессор Си не самая приятная вещь. :(
        Ответить
        • не всё то приятно, что полезно
          Ответить
          • Не спорю. Однако, использовать его надо аккуратно и осмотрительно, а не то может получиться не слишком красиво. Да и не о дефайнах я мысль вёл, а больше об инклудах.
            Ответить
    • Во, вопрос назрел!
      Стоит ли это конкретно выправить, написать комментарий, что так делать нельзя и отправить кто там поддержкой всего этого занимается в виде патча?
      Ответить
      • хз. еще неплохо было бы переименовать length() в size() ибо все должно быть похоже на STL
        Ответить
        • тото же, вряд ли примут, ведь уже кучу говномодиков наклепали и прочая дребедень.
          Ответить
    • а может обфускация?
      Ответить
    • Исключение из непосредственного текста прогарммы тривиальной логики итерирования - это весьма полезная вещь, и к ней старательно стремятся во всех процедурных языках программирования, включая и С и С++. В С++ механизм шаблонов позовляет получить неплохие результаты. В С (или в С++ при неиспользовании шаблонов) с этим сложнее.

      Именно этого пывтались достичь авторы вышепроцитированных макросов. Идея - хорошая и похвальная. Реализация - говнокодовая. Есть такой стиль говнокодирования, когда самый верхний целочисленый цикл - всегда по `i`, вложенный в него - по `j`, а в него - по `k`. Причем независимо от того, по чему именно ведется итерирование. Вот под такой стиль организации циклов и заточены вышеприведенные макросы.
      Ответить
      • тогда уж
        #define loopiv(i,v) for(int i = 0; i<(v).length(); i++)
        Ответить
    • показать все, что скрытовы таки нихуя не шагите: есть такая рассово французкая либа CImg, таки матана вам тоже не понять, для чего она была создана, но в ней таки есть кодт и похуже, и не говно, а вы кушайте, кушайте:
      #define cimg_for_out1(boundi,i0,i1,i) \
       for (int i = (int)(i0)>0?0:(int)(i1)+1; i<(int)(boundi); ++i, i = i==(int)(i0)?(int)(i1)+1:i)

      и многа, многа такога... лососнули тунцов?
      Ответить
    • define - неисчерпаемый источник говна. просто золотая жила
      так возблагодарим же Кернигана с Ричи за такой подарок говнокоду.
      Ответить

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