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

    +140

    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
    virtual QModelIndex parent(const QModelIndex &child) const = 0;
    
        virtual QModelIndex sibling(int row, int column, const QModelIndex &idx) const;
        virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0;
        virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;
        virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const;
    
        virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0;
        virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
    
        virtual QVariant headerData(int section, Qt::Orientation orientation,
                                    int role = Qt::DisplayRole) const;
        virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value,
                                   int role = Qt::EditRole);
    
        virtual QMap<int, QVariant> itemData(const QModelIndex &index) const;
        virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles);
    
        virtual QStringList mimeTypes() const;
        virtual QMimeData *mimeData(const QModelIndexList &indexes) const;
        virtual bool canDropMimeData(const QMimeData *data, Qt::DropAction action,
                                     int row, int column, const QModelIndex &parent) const;
        virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action,
                                  int row, int column, const QModelIndex &parent);

    ну, вы поняли. они написали тысячи говнокода и говорят, что это круто.
    они написали говно-пример, и говорят, что это круто.
    а вы что думаете по этому поводу?

    Запостил: FadeToBlack, 29 Октября 2014

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

    • Кому-нибудь все равно пришлось бы эти тысячи говнокода писать. Пусть лучше они, чем я.
      Ответить
    • -
      Ответить
    • В том то и дело, что сразу понял, что они заставляют меня писать говнокод. нафиг такое, если не умеют проектировать нормально - почему я должен подчиняться? почему я должен писать эту фигово спроектированную модель, где пример - это заведомый говнокод ?
      Ответить
      • КМК оно везде говно, только тут - документированное и с примерами. МВЦ, похоже, вообще по-человечески не перепроектируешь, постоянно натыкаешься на какие-нибудь ебучие детали, которые накапливаются в большую кучу кю. То индексы работают медленно, то нужно через display_string во вьюшки вывод фильтровать. Тьфу. Хоть свой язык императивно-декларативный для модели пили, чтобы данные с логикой по-человечески писать, а не в огромном свитче, как в Qt предлагают.
        Ответить
        • >> а не в огромном свитче, как в Qt предлагают.
          вот именно. программисты на си любят свитчи. они сваливают все мыслимые и не мыслимые данные в один объект, а потом делвают switch_case по типу. и это функциональный подход. наследование и полиморфим в ооп были созданы имеено с целью избавиться от такого подхода. но тут я вижу "возвращение к истокам", и получается клубок какого-то неадекватного кода.
          Ответить
          • Приведи хоть одно преимущество использования visitor pattern вместо switch-case по типу.
            Ответить
            • Дык это джва частных случая одной общей проблемы...

              switch удобнее, когда добавляются новые методы, но не типы.
              visitor удобнее, когда добавляются новые типы, но не методы.

              А общего решения в крестах, походу, нет и не будет. wvxvw может злорадно смеяться.
              Ответить
              • Чем визитор удобнее при добавлении новых типов? Также для каждого типа в каждый визитор придётся дописывать новый visit(MyNewType).
                Когда добавляются новые типы, но не методы - это типичный ООП с Triangle extends Shape.

                Оба подхода решают одну и ту же задачу - добавление новых "виртуальных" методов к фиксированной иерархии/набору типов. При увеличении числа типов оба подхода ведут к страданиям.

                У визитора visit(Base&), у switch - default.

                Зато в switch управление у тебя - прерываешь обход дерева когда захочешь. А визитор - реинкарнация сраных коллбеков.
                Ответить
                • Тьфу, я совсем дурак. Спутал визитора с обычным полиморфизмом ;)

                  Визитор нинужен.
                  Ответить
                  • Визитор
                    1) позволяет делать дефалтное поведение для необработанного типа
                    2) может требовать всех поддержать новый тип (тупо не скомпилится)
                    3) кастов там нет, но безопастность тут не главное
                    Ответить
                    • 1) Непонятно, что имеется в виду. Catch-all перегрузка? Почти как default в свитче.
                      2) Не всегда плюс, да и несколько противоречит пункту 1, не так ли?
                      Алсо, в случае енумов компилятор тоже эмитит ворнинги для неразобранных кейсов без дефолта.
                      3) Да, в свитче нужны касты. С другой стороны, не требуется наследование и виртуальные методы и питушня с свойным диспатчингом. Олсо, ациклический визитор в стиле александреску всё же требует дайнэмик каст.
                      Ответить
                • зато визитор типа типо безопасней свичей
                  последние-то без кастов не разрулить
                  зубов бояться - в рот не давать, возразит публика, и будет по-своему права
                  Ответить
                  • > последние-то без кастов не разрулить
                    Ты так говоришь, как-будто в визиторе-по-типам нет кастов... Они там всяко есть, просто инкапсулированы.
                    Ответить
                    • Даункастов у типичного визитора действительно нет.
                      Мне в принципе нравится гошный подход

                      https://golang.org/doc/effective_go.html#type_switch

                      Хотел как-то визитор в Go написать, но потом одумался и осознал.
                      Ответить
                      • > Даункастов у типичного визитора действительно нет.
                        Если его юзать как typeswitch для полиморфного контейнера - будут. Или я сегодня туплю?
                        Ответить
                • говнокод до пидарасов
                  Ответить
        • Дык свич нужен для прикручивания моделек к POCO... А там вариантов почти нет - либо свич, либо препроцессор/генератор, либо отказ от POCO. Рефлексию то не завезли.

          А в более обобщенных случаях реализация модельки не напрягает, ибо один раз.
          Ответить
          • Юзаешь POCO? И как оно?
            Со стороны похоже на жабу, кругом унылое ооп и сырые указатели, но хотя бы не требует долбанутого препроцессора как qt.
            Ответить
            • Не, я имел в виду plain old c++ object по аналогии с POJO ;) Про одноименную либу я не знал.
              Ответить
    • -
      Ответить

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