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

    +12

    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
    AttachmentService::MimeType AttachmentService::mimeTypeByCodeKey(const QString &codeKey) const
     {
         if(codeKey.toLower() == QString("MimeType_PDF").toLower())       return MimeType_PDF;
         if(codeKey.toLower() == QString("MimeType_JPEG").toLower())      return MimeType_JPEG;
         if(codeKey.toLower() == QString("MimeType_PNG").toLower())       return MimeType_PNG;
         if(codeKey.toLower() == QString("MimeType_HTML").toLower())      return MimeType_HTML;
         if(codeKey.toLower() == QString("MimeType_ZHTML").toLower())     return MimeType_ZHTML;
         if(codeKey.toLower() == QString("MimeType_TEXT").toLower())      return MimeType_TEXT;
         if(codeKey.toLower() == QString("MimeType_XLS").toLower())       return MimeType_XLS;
         if(codeKey.toLower() == QString("MimeType_DOC").toLower())       return MimeType_DOC;
         if(codeKey.toLower() == QString("MimeType_PPT").toLower())       return MimeType_PPT;
         if(codeKey.toLower() == QString("MimeType_GIF").toLower())       return MimeType_GIF;
         if(codeKey.toLower() == QString("MimeType_BMP").toLower())       return MimeType_BMP;
         if(codeKey.toLower() == QString("MimeType_MPEG").toLower())      return MimeType_MPEG;
         if(codeKey.toLower() == QString("MimeType_MP4").toLower())       return MimeType_MP4;
         if(codeKey.toLower() == QString("MimeType_MP3").toLower())       return MimeType_MP3;
         return MimeType_UNKNOWN;
    }

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

    Запостил: FlySnake, 09 Мая 2014

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

    • в плюсах нет Enum.valueOf ?
      Ответить
      • Нету. Там enum это просто набор именованных целочисленных констант, да еще и с кривым скопом.
        Ответить
    • > было сравнение строк как есть
      а что, в ку-говне всё ещё нет годного ассоциативного контейнера?
      Ответить
      • QMap<QString, AttachmentService::MimeType>
        QHash<QString, AttachmentService::MimeType>

        Выбирай ;)
        Ответить
        • На практике подобные вещи ухудшают читабельность и увеличивают кол-во г-кода. Тупой "свитч" по строкам имхо нагляднее
          Ответить
          • > Тупой "свитч" по строкам
            Но ведь C++ не может свитч не по интегральному типу...
            Ответить
            • А потому и "тупой" в кавычках - if else if,,, и есть тупой свитч :)
              Ответить
        • > Выбирай
          ололо, где же свой функтор на сравнение?
          а в хеше - и функтор на хеш?

          автор не спроста же захотел insensitive
          Ответить
          • Ну ок, убедил.
            Ответить
          • > ололо, где же свой функтор на сравнение?
            > а в хеше - и функтор на хеш?
            QHash использует перегрузку свободной функции qHash для расчета хеша. Как-то так:
            class QovnoString : public QString { /*...*/ };
            
            uint qHash(const QovnoString & str, uint seed = 0) {
                return qHash(str.toLower(), seed);
            }
            
            QHash<QovnoString, AttachmentService::MimeType> map;
            Ответить
            • Но это один хер не поможет сделать case-insensitive коллекцию. Ну разве что замутить потомка от строки с переделанными операторами сравнения и qHash().
              Ответить
              • Не поленился, качнул кутешечку.
                #include <QCoreApplication>
                #include <QString>
                #include <QHash>
                #include <QDebug>
                
                class QovnoString : public QString {
                public:
                    QovnoString(const char * c) : QString(c) { }
                    bool operator== ( const QovnoString & other ) const
                    {
                        return toLower() == other.toLower();
                    }
                };
                
                uint qHash(const QovnoString & str, uint seed = 0) {
                    return qHash(str.toLower(), seed);
                }
                
                QHash<QovnoString, int> map;
                
                int main(int argc, char *argv[])
                {
                    QCoreApplication a(argc, argv);
                
                    map["abcd"] = 100500;
                    qDebug() << map["AbCd"];
                
                    return a.exec();
                }
                Мне это говно еще придется кушать некоторое время, так что ничего, кроме равнодушия, я к кутешечке не испытываю.
                Ответить
              • Всё гораздо проще :) В хеш вставлять ключи в нижнем регистре и вынимать тоже:
                QHash<QString, AttachmentService::MimeType> map;
                
                AttachmentService::MimeType AttachmentService::mimeTypeByCodeKey(const QString &codeKey) const 
                {
                    return map[codeKey.toLower()];
                }
                Ответить
                • > В хеш вставлять ключи в нижнем регистре и вынимать тоже
                  Дык это нарушение инкапсуляции. Если так постоянно делать - где-нибудь в обяз забудешь сделать lower case и кровь-кишки.
                  Ответить
    • nested тип не смутил AttachmentService::MimeType никого? Обычно такие штуки вызывают неприятие у общественности.
      Ответить
      • > вызывают неприятие у общественности...
        ... которая не видела буст etc.

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

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

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