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

    +999

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    #include <iostream>
    #include <algorithm>
    #include <stdlib.h>
    
    const size_t MB = 1024*1024;
    size_t MOD = 0;
    
    unsigned char uniqueNumber () {
      static unsigned char number = 0;
      return ++number % MOD;
    }
    
    int main(int argc, char** argv) {
      if (argc < 3) {
        return 1;
      }
    
      size_t BLOCK_SIZE = atoi(argv[1]) * MB;
      MOD = atoi(argv[2]);
    
      unsigned char* garbage = (unsigned char *) malloc(BLOCK_SIZE);
    
      std::generate_n(garbage, BLOCK_SIZE, uniqueNumber);
      std::sort(garbage, garbage + BLOCK_SIZE);
    
      free(garbage);
    
      return 0;
    }

    http://habrahabr.ru/blogs/cpp/138132/

    It makes me cry. Понятно, что это всего лишь демонстрационный пример. Но все таки это не оправдание. Итак, начнем по порядку с самого худшего:
    1. Сишные malloc/free вперемешку с STL-алгоритмами. WTF? Зачем?
    2. Глобальная переменная? Автор не осилил хотя бы bind? Который, к тому же, уже давно std::bind.
    3. Uppercase для локальной переменной.
    4. Отступ в джва пробела.

    Запостил: invi, 15 Февраля 2012

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

    • Это когда на хаброте что-то было полезное/вменяемое?
      Ответить
      • Там была статья про У-комбинатор, которая я прочитал и врубился.
        Ответить
        • >статья, которая я прочитал
          Завязывай
          Ответить
    • а еще include <iostream>, тут неиспользуемый,
      и еще можно было бы поругацца на <stdlib.h> вместо <cstdlib>, но они тут оба не нужны
      но согласен с предыдущим оратором, что на хабре приведенный код всегда радует профессионализмом, не только в указанном топеге
      Ответить
    • > unsigned char* garbage

      Это комментарий автора по поводу качества кода?
      Ответить
    • А что с "отступом в два пробела"? Отступ должен быть именно и ровно в два пробела.
      Ответить
      • это тебе к тарасу
        у него раковый дельфишный код пускает метастазы, что ничего не влазит
        а у тебя, наверное, рабочий монитор 5 дюймов

        когда по горизонтали 1920 и больше точек, конечно удобно рассматривать кучно расположенное говно, приклеенное к левому борту - советую вообще отступов не делать, они для слабаков
        и ни в коем случае пустые строки нельзя делать, потому что по вертикали надо тоже место экономить
        Ответить
        • Ну это, наверное, если у котго-то все для той же "экономии места" шрифт выставлен такой, что каждая буковка - с блоху, тогда конечно, все получается похожим на "приклеенное к левому борту говно". И хочешь-не хочешь приходится делать отступы по щестнадцать пробелов, чтобы хоть структура кода различима была.

          Вот у меня, например, отступы извечно были по 2. И никаких проблем. А избыточное горизонтальное пространство на "мультимедийных" мониторах надо использовать для других полезных целей, а не компенсировать его незаполненность баловством с гулливеровскими отступами.
          Ответить
          • правильно, даёшь индентосрач и холивар!
            товарищ страуструп предлагает использовать для отступа 5 пробелов
            Ответить
            • кстати насчет 5 символов у страуструпа - он же в своих книжках вообще на моноширинные шрифты положил, писал курсивом неопределенного пропорционального шрифта, а табы ставились, скорее всего, в пропорциях от этого шрифта
              Ответить
              • я знаю, она у меня есть в бумажном варианте, я её два раза читал, но связывать карьеру с c++ так и не решился
                Ответить
            • а еще для пущего веселья давайте использовать немоноширинный шрифт
              Ответить
              • Почему бы и нет.
                Особенно, если будет автовыравнивание по :, => и :=, чтобы красивеее смотрелись строки типа
                a: integer := 0;
                b: float := pi-float(a);
                Ответить
                • а если имя типа или переменной изменится, снова всё выравнивать автоматически?
                  Ответить
                  • Да.
                    Ответить
                    • убожество
                      Ответить
                      • Почему?
                        Выравнивать, очевидно, не весь код, а только блок подряд идущих строк, содержащих : или :=
                        Ответить
                        • Потому что любая лишняя зависимость одной строки от другой не есть гуд.
                          К тому же, накладывает на редактор специфические требования. Что будет с кодом, если его будут править в редакторе без функции автовыравнивания?
                          Ответить
                          • Ничего не будет.
                            Выравнивание будет влиять только на внешний вид, а не на содержимое, как и подсветка, например.

                            (что будет с подсветкой, если код в ворде перекрасить? Да ничего не будет)
                            Ответить
                            • вспомнился анекдот:
                              - Что будет, если взорвать атомную бомбу?
                              - Ничего не будет.... В радиусе нескольких километров.

                              А код должен быть красив и единообразен вне зависимости от используемых редакторов.
                              Лишняя сложность не приветствуется.
                              Ответить
                              • Да ну нах, я вот набрал код в студии, привык пробелами равнять, а она мне в некоторых местах табы понаставила сама. Открываю код в блокноте, вижу пиздец.
                                Так что похер, как что выглядит не в редакторе кода.
                                Ответить
                                • Мне лично не пофигу, как мой код выглядит, к примеру, в вебе. Потому всё ровняю пробелами, а не табами (благо вменяемые редакторы имеют такую опцию). Выравнивать присваивания - assembler-style, Роберт Мартин не одобряет.
                                  Ответить
                                  • >Роберт Мартин не одобряет.
                                    Стив Макконнелл тоже.
                                    Ответить
                                    • Почему? Красивее, читаемее.
                                      И объявления типов тоже ровнять удобно.
                                      Ответить
                                      • Потому что это лишняя работа, которая требует переделки в случае изменения имен/типов, добавления других переменных и пр.
                                        Ответить
                                        • Ну так я же и предлагаю блин эту работу переложить на компутер!
                                          Ответить
                                      • > Красивее, читаемее.
                                        int x                                        = 0;
                                        IXmlNodeAttributeValue xmlNodeAttributeValue = null;
                                        чему равно x? Лишняя зависимость между строками - большой минус в групповой разработке, ибо всегда найдется уникум, который эту "красоту" сломает. Блин, да у нас в коде по большей части мясо из пробелов и табов, не смотря на гайдлайны. А тут - выравнивание знаков равенства...
                                        Ответить
                                        • 0, и глаза сразу это отлавливают:) Главное чтобы ширины монитора хватило.
                                          Ответить
                                          • мне лично приходится переводить взгляд налево и направо, чтобы соотнести переменную и значение. Зачем усложнять жизнь?
                                            Ответить
                                            • Это все личные предпочтения. Многим такое написание жизнь упрощает даже если приходится равнять ручками.
                                              Ответить
                                            • У тебя пример нетипичный просто.
                                              Ответить
                                        • Ещё раз, бля. Я не предлагаю руками делать красоту, я предлагаю в редактор встроить средства для автоматического наведения красоты.
                                          А вы всё опять приводите аргументы о том, как неудобно наводить красоту руками.
                                          Троллите?
                                          Ответить
                                          • Тебе говорят, что эту "красоту" порой ещё и трудно читать. Она требует лишней работы, никак не отражающейся на качестве кода, негативно влияет на Change Tracking. В команде из более 2 упоротых программистов поддерживать такую "красоту" просто не получится. Лучше пустить энергию в более полезное русло.
                                            не уверен, что идея умеет делать такую "красоту" из коробки
                                            Ответить
                                • Блокнот не подходит в качестве повседневного редактора кода. Да и всё можно настроить, как уже сказал roman-kashitsyn.
                                  Ответить
                                  • Вот именно, вот и нехер смотреть код через блокнот.
                                    Ответить
                                • Есть ещё один минус - работа с VCS. Я знаю, что ты этим не пользуешься, потому поясню: если ты поправил одно из присваиваний так, что придётся переформатировать присваивания в соседних строках (пусть это даже сделает редактор), эту информацию придётся записать в VCS. Для большинства VCS минимальной единицей работы является строка. Когда кто-то захочет посмотреть, что же поменялось между двумя правками, ему придётся просматривать (или тянуть из репозитория) больше строк, чем реально требуется.
                                  Ответить
                                  • А если не писать в VSC?
                                    Вот ты когда поставить где-то /*, тем самым закомментировалось 100 строк, в ВСЦ же не пишется про каждую, что она изменила цвет на серенький?
                                    Ответить
                                    • > она изменила цвет на серенький
                                      потому что код раскрашивает твой редактор. Вот если отступы изменились - файл поменялся, и эти изменения надо трекать. У нас, например, реформат кода ради эстэтики не приветствуется на уровне корпоративного стандарта.
                                      Ответить
                                      • БЛЯЯЯЯ
                                        В 100500 раз говорю: выравнивание тоже делается чисто редактором чисто на уровне внешнего вида, никто пробелы в строки на самом деле не добавляет. Так же как и раскраску символов.
                                        Давай, тролль, ещё раз скажи, как неудобно пробелы руками переставлять.
                                        Ответить
                                        • Т.е. Ты хочешь, чтобы редактор отображал строки кода не так, как они реально хранятся в файле, добавляя виртуальные пробелы для отображения?
                                          Ну не знаю, идея спорная. Шрифты и цвета - хорошо, фолдинг тоже можно понять, но горизонтальные изменения текста...
                                          Полезность сомнительная. Если тебе очень нужно - напиши плагин. По мне так оно того не стОит. Я предпочитаю больше контроля, всегда включаю подсветку непечатных символов, чтобы видеть, где пробелы, а где - табы.
                                          Ответить
                                          • > Т.е. Ты хочешь, чтобы редактор отображал строки кода не так, как они реально хранятся в файле, добавляя виртуальные пробелы для отображения?

                                            ДАААА НАКОНЕЦТО:
                                            >> Выравнивание будет влиять только на внешний вид, а не на содержимое, как и подсветка, например.

                                            > Я предпочитаю больше контроля, всегда включаю подсветку непечатных символов, чтобы видеть, где пробелы, а где - табы.

                                            Одно другому не мешает.
                                            Ответить
                                  • но можно ведь игнор для символов пробельной группы сделать.
                                    Ответить
                                    • В гуёвых толстых клиентах можно многое. Я, например, очень часто пользуюсь svn web client (смотрю диффы прямо из jira), он работает построчно.
                                      Ответить
                                    • Ну и если их игнорировать, то какой смысл тогда в форматировании? :) Вы же его и не увидите никогда.
                                      Была похожая идея, flexible tabs или как-то так. Все пробельные элементы в коде набирались бы табуляцией, а редактор бы сам по уже расставлял куда нужно. Т.е. в примере выше было бы:
                                      int\tx\t=\t0;
                                      IXmlNodeAttributeValue\txmlNodeAttributeValue\t=\tnull;

                                      И таким образом проблема с контролем версий решилась бы. Но мне просто не нравится выравнивание по присваиванию, т.как в этом нет никакой семантической нагрузки. Выравнивание по левой стороне, когда это выделяет блок кода несет семантическую нагрузку, например - т.е. помогает понимать код. А связи между двумя присваиваниями как правило нет. Они просто случайно оказались подряд.
                                      Ответить
                                      • показать все, что скрытоОй, не хорошо это когда выражения рядом друг с другом случайно появляются.
                                        Ответить
                                      • Это где как. Если большая часть логики состоит из объявлений констант, зависящих от предыдущих констант, то это очень даже нужно.
                                        Ответить
                                        • И каким образом выравнивание (группировка) поможет вам сориентироваться в логической последовательности? Последовательность естесственным образом понятна из того, какая строчка за какой идет, выравнивание ничего в этом смысле не добавит. Если бы вы, например, предложили строчки, которые должны выполнятся в определенном порядке красить в цвета от светло-серого до черного, где насыщенность показывала на сколько ближе к концу или началу находится данная строчка - это было бы очень уникально, но, по крайней мере логично :) А так вообще нет связи.
                                          Ответить
                                          • Выравнивание - поможет, ровно так же как и подсветка синтаксиса.
                                            Ответить
                                            • Так подсветка синтаксиса не помогает сама по себе, если вы будете рандомально красить во все цвета радуги - ситуация только ухудшится.
                                              Ответить
                                          • Легче выделить из текста столбик значений, например, или столбик типов.
                                            Когда структуру описываешь, очень полезно.
                                            Ответить
                                            • Это для нового двумерного языка программирования.

                                              Кстати, вот в ColorForth же цвета имели синтаксическое значение. Можно пойти дальше.
                                              Ответить
            • Нечётный размер в пробелах удобен тем, что сразу видна смесь табуляции с пробелами (при 4 или 8 можно не заметить).
              Ответить
          • на вашей клавиатуре отсутствует клавиша "TAB"?
            Ответить
          • категоричность о двух пробелах явно свидетельствует о глубоких комплексах

            если тебе так удобно, это не значит что всем так удобно
            4 символа на таб удобны большему числу людей, например
            или ты в 80 горизонтальных символов стараешься влезть?

            и да, монитор с 1200 по вертикали используется по прямому назначению - написание кода, а стоит он недорого, думаю, любой может себе позволить в 2012 году видеть 60 строк кода нормальным шрифтом, вместо того, чтобы говнокодить на калькуляторах - продуктивности больше
            Ответить
            • > 4 символа на таб удобны большему числу людей, например

              Большинству крестовиков, а не большинству людей.
              Ответить
              • > Большинству крестовиков
                c, c#, java, javascript, php, python, ... - 4 пробела (линус жаждет 8)
                scala, ruby, delphi - 2 пробела
                lisp - зависит от структуры кода
                в принципе, у дельфи неплохие соседи
                Ответить
            • Друзья, не спорьте что лучше: 2 или 4. Выбирайте 3. Как я.
              Ответить
            • ХЗ, мне не удобно работать без того, чтобы видеть одновременно с кодом список функций / переменных, дерево с папками / файлами проекта, REPL :), ну и еще одно-два окна с bash. А еще желательно окно с историей (какие файлы отркывались недавно), а еще желательно окно с результатами последней компиляции... Да и просто не удобно читать длинные строчки - книжки тоже, не смотря на то, что технических ограничений нет, не печатают (не печатали) так, чтобы по горизонтали влезало больше 72 символа (это еще из ГОСТ, кажется). Еще можно понять, когда кому-то нраваятся имена типа cTVendorProjectDataObjectImpl - там уже тяжело будет развернуться, но это ж не нормально.
              Ответить
              • На самом деле широкий текст херово воспринимается, поэтому широкие мониторы говно.
                Ответить
              • > окно со списом функций и переменных
                Зачем при разработке - а конкретно при кодировании - на С++ видеть список функций и переменных? Функции и переменные бывают членами класса и внешними, + переменные еще локальные/аргументы. Ваш класс пустил столько метастазов, что постоянно путаетесь в десятке методов и паре членов? Вы пишете тело метода такой высоты, что сложно поднять глаза на 10 строк выше и посмотреть имя аргумента - нужен пейджап? Нормальная ide всегда рада подсказать после . -> :: что нибудь полезное, а после ввода 1-2 символов уточнить список практически до 1 варианта.
                Когда надо найти функцию/структуру/енум, которая предположительно описана в этом файле - в моей ide всегда можно воспользоваться вверху выпадающим списком с алфавитной сортировкой.

                > дерево с папками/файлами
                согласен, живёт справа

                > REPL
                для С++? уточнить чему будет равно 1+2? должно маячить?

                > bash
                зачем? особенно два. или у вас компиляция не запускается по комбинации клавиш, надо ручками?

                > окно с историей
                а это зачем? или ваша ide не знает про табы и что можно одновременно несколько документов держать открытыми?

                > окно с результатами последней компиляции
                пригодно только для перехода к ошибкам компиляции по двойному клику, видеть его 100% времени нет никакого смысла - разве что вы 100% времени только и делаете, как исправляете ошибки компиляции

                > книжки
                вы пишете код или книжку? вам надо ваш код распечатывать на матричном принтере?

                вот то то и оно, что ХЗ
                Ответить
                • у меня лично тоже несколько окошек с bash.
                  1. Собирается одной командой, но из консоли быстрее. К тому же, часто меняю опции сборки в зависимости от ситуации, в консоли это удобнее (дописал, к примеру, -о и порядок).
                  2. Некоторые операции с VCS выполняю с cli-клиентом, ибо так быстрее, надёжнее, и есть grep.
                  3. Логи сервака, запущенного из-под другого пользователя.
                  Ответить
                  • ты тоже пишешь на С++? Опции сборки прокта в зависимости от ситуации, это точно многоразовая операция?
                    окошки баш у тебя встроены в иде? - вместо альттаба в нормальное полноэкранное окно назначаешь специальную комбинацию клавиш из 4-5 кнопок и переходишь в кастрированное 20х30 символов? и да, окошки баш - очевидно, проблема в недоразвитости любой иде в стенах линукс.
                    Ответить
                    • Пишу на java. В винде болше всего мне не хватает нормальной консоли и нормальных простых инструментов.
                      Да, баш - в отдельном полноэкранном окне, и при активном девелопменте я им пользуюсь не особо часто.
                      Ответить
                • Нет, это для быстрого перехода (обычно это окно называется outline), и не важно какой длины функция, это просто удобно. Классов может быть много, я даже и пытаться не буду запоминать какие именно функции есть у класса / какие функции объявлены в этом файле (outline может показывать иногда и унаследованые методы, с возможностью быстрого перехода к клсассу, который метод объявил). Вобщем - это удобно, и не надо расказывать о том, как можно себе отказывать в удобствах.

                  REPL - чего-нибудь посчитать, да, даже просто какие-нибудь константые значения. 1 + 2 я еще пожалуй в уме смогу, а найти gcd двух четырезначных чисел - вряд ли. ОК, может и смогу, но мне лень.

                  Я же написал, что для компиляции - отдельный буфер. bash нужен для разных вещей, например, пишу какое-нибудь задание с использованием latex для документации - мне лень специально для этого в .emacs добавлять функцию - проще держать отркытый терминал и когда нужно запускать генератор PDF. Часто бывает нужно отслеживать что делает система во время запуска приложения, (например, чтобы какой-нибудь tail / watch / trace все время бежал и т.п.) И, да, большую часть рабочего времени я компилирую, смотрю, что получилось, и исправляю / добавляю - поэтому мне и нужно видеть результат компиляции. Мне странно что это кому-то кажется странным.

                  Emacs знает про табы, но история помогает сориентироваться быстрее - я не всегда помню в каком файле что было, да и не хочу помнить - слишком много лишней информации.

                  Я пишу код для людей, а не для принтеров, матричные принтеры и книги не совместимы... я вообще не понял сравнения. Книги сделаны так, как сделаны потому, что так читать удобно, а не потому, что есть какие-то технические ограничения.

                  Кроме всего прочего, я печатаю транслитом, и мне влом идти на translit.ru - так у меня еще и буффер для транслитерации есть :P
                  Ответить
                • http://tinypic.com/r/v2zbdd/5
                  - чтобы было понятнее об чем речь.
                  Ответить
                  • Было бы очень интересно узнать, для каких целей вы используете CL. Сколько не присматривался к нему для реализации некоторых вспомогательных задач, так и не решился делать на нём что-то существенно серьёзней "hello world". Проблемы:
                    1. Даже такие тривиальные операции, как обработка аргументов командной строки, зависят от реализации.
                    2. Соответственно, низкая переносимость, особенно между разными ОС. Если писать не только для себя, пользователю придётся воссоздавать моё окружение или качать тяжёлый исполняемый образ лисп-системы.
                    3. Недостаточное количество библиотек.
                    Посему могу заключить, что он CL можно с успехом использовать где-нибудь на веб-сервере, где скорость работы важнее переносимости.
                    Для повседневных задач более практичным и удобным мне всё-же кажется Clojure.
                    Ответить
                    • На работе - использовал всего один раз, и, вобщем, не показательно, т.как просто система была очень плохо построена. Мне нужно было тестировать взаимодействие клиента и сервера, но тестового сервера у меня не было (люди, которые писали сервер вообще не затруднляли себя такими соображениями как написание тестов, модульной архитектурой... - их код в принципе нельзя было использовать без настоящей базы данных, настоящих пользователей и т.п.)
                      Кроме того, я это делал больше в целях попрактиковаться - так что там было много смешных вещей, например, был написан скрипт, который во время сборки проекта скачивал какой-то документ из ГуглДокс и на его основе чего-то там генерил :) Это потому что научить секретаршу делать комиты в репозитори оказалось очень затруднительно.
                      И, вобщем, я собрал систему которая автоматически сидела в чате, обменивалась сообщениями, чего-то там разным сервисам отсылала). К сожалению, я больше над этим не работаю. Для моих задач - хватало за глаза и за уши + переносимость меня не волновала т.как все, вобщем-то, запускалось на моей машине, и, даже если оно бы и запустилось у кого-то еще, никто из сотрудников не сгорал желанием попробовать :)
                      Ответить
                      • Спасибо.
                        У нас, кстати, данные для стабов хранятся в svn в экселевских документах (чтобы инженеры по тестированию могли их править) и разбираются джабо-кодом на старте стаб-приложения.
                        Геморрой начинается при мёрже или попытке посмотреть дифф...
                        Ответить
        • > раковый дельфишный код

          ололо.
          Только "раковый дельфишный" при двух пробелах читается нормально, а крестовикам двух уже да, мало.
          Ответить
          • Мне хватает двух пробелов [(иногда, когда мне хочется написать какую-нибудь небольшую дрянь на цпп)]. Трёх хватит всем.
            Ответить
      • Вот для этого и существует табуляция. Хочешь — выставляй у себя два пробела, хочешь — 8.

        Но два пробела всё же маловато. При комментировании (// или /*) строка сдвигается. Минимум три.
        Ответить
        • Тут главное не совмещать табы и пробелы. Иначе будет хаос.
          Ответить
          • "... для управляющих конструкций используются только непечатаемые символы, а именно: пробел, перевод строки и табуляция. Интересным следствием этого факта является то, что текст программы на языке Whitespace можно «скрыть» внутри исходных кодов другой программы."
            Ответить
    • ну да, а если у него еще и
      MOD = atoi(argv[2]);
      вернет 0 (ну мало ли, что там в аргах у нас...) - схватит деление на ноль))
      Ответить
    • показать все, что скрытоvanished
      Ответить

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