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

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    metrics_key::metrics_key(std::initializer_list<std::string> const& il) {
      TRI_ASSERT(il.size() > 0);
      TRI_ASSERT(il.size() < 3);
      name = *il.begin();
      if (il.size() == 2) {
        labels = *(il.begin()+1);
      }
      _hash = std::hash<std::string>{}(name + labels);
    }

    просто гавно

    Запостил: gnusmas, 18 Марта 2021

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

    • Говно.
      Зачем аргументы передавать списком?
      Ответить
    • Слишком мало Modern C++.
      metrics_key::metrics_key(std::string name_, std::optional<std::string> label = std::nullopt_t)
          : name(std::move(name_)), labels(std::move(label).value_or(std::string()) 
      {
          _hash = std::hash<std::string>{}(name + labels); // На случай если порядок объявления запутанный
      }
      Ответить
      • Код не эквивалентен, в оригинале можно было больше аргументов передать.
        Ответить
        • но не больше двух?
          Ответить
          • Да можно и больше 2, оно просто ассёртнется в рантайме. А теперь оно не конпелируется!
            Ответить
            • а что такое TRI_ASSERT, кстати?
              всмысле TRI это 3?
              Ответить
              • Какое-то кастомное говно. Но точно не статик, т.к. size() в комплайтайме неизвестен.

                > всмысле TRI это 3

                Я думаю это "неймспейс" их либы.
                Ответить
                • я уже понял, что статик не может быть

                  я просто подумал, что initializer_list ты можешь проверитьв компайл тайм, но видимо не всегда
                  Ответить
                  • > initializer_list ты можешь проверитьв компайл тайм

                    Не, для сложных проверок в комплайтайме придётся вариадик темплейт городить... Лист здесь бессилен. А простые можно оверлоадами или дефолтными аргументами разрулить.
                    Ответить
                  • З.Ы. Я когда-то ваял функцию, которая в компайлтайме проверяла, что ей передали чётное количество аргументов правильного типа, а потом отдавала их в сишный вариадик.
                    Ответить
                    • какой кошмар)

                      но тут еще смешнее: аргументов может быть от 1 до 2 включительно. Нахуя вообще все это городить?
                      Ответить
                      • > какой кошмар

                        Просто часто промахивался при вызове сишной версии. Там были key/value пары и нулл в конце. А в крестах это таки получилось выразить красиво и типобезопасно.
                        Ответить
                        • почему было не передать (указатель на) массив структур с key/value или как-то хуйнуть их вараргом?
                          Ответить
                          • Неибу. Сишное апи не я проектировал. Видимо на пирфоманс и лаконичность дрочили, как обычно.
                            Ответить
                            • ох сишка, моя сишка
                              эти вечные
                              ioctl(int fd, unsigned long request, ...);
                              Ответить
            • Fail Fast это тоже один из принципов современного программирования. Раньше компайлтайма сломаться сложно.
              Ответить
              • Ну вот взял и сломал программу! Всё же работало нормально в релизной сборке, а теперь она даже не собирается.
                Ответить
                • template <typename ...Ts>
                  metrics_key::metrics_key(std::string, std::optional<std::string>, Ts...) : metrics_key() {}
                  
                  metrics_key::metrics_key() {TRI_ASSERT(false);}

                  Починил, компилируется.
                  Ответить
                  • Сообщения об ассёртах не эквивалентны.
                    std::array<std::string, 0> il;
                    TRI_ASSERT(il.size() > 0);
                    Ответить
              • > Раньше компайлтайма сломаться сложно.

                Можно и раньше, если приучить юзера, что после изменений всё ломается. Тогда у него рефлекс будет срабатывать сразу, когда он задумается о новой фиче: "опять эти мудаки что-нибудь сломают, лучше сделаю вручную".
                Ответить
              • >. Раньше компайлтайма сломаться сложно
                статический анализ в IDE?
                Ответить
                • Но он же просто варнингами сыплет и строчки подсвечивает, а кто на это обращает внимание? Вот если бы он разряд тока давал программисту, или просто закрывался без сохранения, тогда да, было бы эффективно.
                  Ответить
                  • Он может уйти в астрал и перестать подсвечивать питушню и дополнять длинную пиииитуууушню, что принесет программисту большие страдания. В code::blocks, если открыть большую либу, то статический анализатор начнет готовить автоподстановки и сломается, а ещё будет фризить экран.
                    Ответить
                    • Ага, я точку боялся нажимать после пары дней работы с code blocks.
                      Ответить
                      • А ты же в QTCreator пишешь крестокод, да?

                        Почему такая вселенская несправедливость имеет место быть: код блокс написан на wxWidgets и он страшный, а QTCreator написан на QT и он прикольный (((
                        Ответить
                        • Х.з., в свежих code blocks поди тоже шланговский парсер привернули вместо цтагс? Или до сих пор лагает?
                          Ответить
                          • Там какой-то кошмарный hand-made плагин:

                            http://wiki.codeblocks.org/index.php/Code_Completion_Design

                            И его хотят переписать:

                            http://wiki.codeblocks.org/index.php/Code::Completion_Rewrite

                            Ахуеть, но я нагуглил шланговский плагин:

                            http://forums.codeblocks.org/index.php?topic=15521.0

                            Note, this plugin will probably fail on advanced projects(at least it fails on this project), just use it on simple stuff for now

                            Ну бля (((
                            Ответить
                            • зачем это говно нужно?

                              с тагсами я и в виме писать могу
                              Ответить
                              • Я не знаю, если честно. Оказывается, код::блокс хуевый (((

                                Пора перейти на CodeLite. Там даже новейшая питушня для автодополнения кода есть. Как вам? «Language Server» называется...

                                https://wiki.codelite.org/pmwiki.php/Main/LanguageServer
                                Ответить
                                • с ленгвидж сервером можно и на VSCode сидеть
                                  Ответить
                  • можно гонять его на CI и запрещать коммитить с ошибкой прекомитхуком
                    Ответить
    • видал у нас подобное говно на жабе. Там люди тоже делали API для измерения чего, и передавали туда сплошные Object.

      Имхо, такой код нужно генерить, а не писать вручную
      Ответить
    • тем временем, человек изобрел компьютер из крабов!
      https://twitter.com/emollick/status/1371932428982493185
      Ответить
      • А можно туда пхпшников вместо крабов? И у тех, и у других клешни)
        Ответить
        • пхпшников я бы не допускал до компутера (в отличие от крабов)
          Ответить

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