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

Комментарии (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, оно просто ассёртнется в рантайме. А теперь оно не конпелируется!
          Ответить
            • Какое-то кастомное говно. Но точно не статик, т.к. 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, если открыть большую либу, то статический анализатор начнет готовить автоподстановки и сломается, а ещё будет фризить экран.
                  Ответить
                • можно гонять его на CI и запрещать коммитить с ошибкой прекомитхуком
                  Ответить
  • видал у нас подобное говно на жабе. Там люди тоже делали API для измерения чего, и передавали туда сплошные Object.

    Имхо, такой код нужно генерить, а не писать вручную
    Ответить
      • пхпшников я бы не допускал до компутера (в отличие от крабов)
        Ответить

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

Переведи на "PHP", guest!

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


    8