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

    +55.3

    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
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    #define constuserColor "usercolor"
    #define consttagColor "tagcolor"
    #define constmsgColor "idcolor"
    #define constQcolor "quotecolor"
    #define constLcolor "linkcolor"
    #define constUbold "userbold"
    #define constTbold "tagbold"
    #define constMbold "idbold"
    #define constQbold "quotebold"
    #define constLbold "linkbold"
    #define constUitalic "useritalic"
    #define constTitalic "tagitalic"
    #define constMitalic "iditalic"
    #define constQitalic "quoteitalic"
    #define constLitalic "linkitalic"
    #define constUunderline "userunderline"
    #define constTunderline "tagunderline"
    #define constMunderline "idunderline"
    #define constQunderline "quoteunderline"
    #define constLunderline "linkunderline"
    #define constIdAsResource "idAsResource"
    #define constShowPhoto "showphoto"
    #define constShowAvatars "showavatars"
    #define constWorkInGroupchat "workingroupchat"
    #define constVersion "0.9.9"
    
    class JuickPlugin : public QObject, public PsiPlugin, public EventFilter, public OptionAccessor, public ActiveTabAccessor,
        public StanzaFilter, public ApplicationInfoAccessor
    {
            Q_OBJECT
            Q_INTERFACES(PsiPlugin EventFilter OptionAccessor ActiveTabAccessor StanzaFilter ApplicationInfoAccessor)
    
    public:
            JuickPlugin();
            virtual QString name() const;
            virtual QString shortName() const;
            virtual QString version() const;
            virtual QWidget* options();
            virtual bool enable();
            virtual bool disable();
            virtual void applyOptions();
            virtual void restoreOptions();
            virtual bool processEvent(int account, QDomElement& e);
            virtual bool processMessage(int account, const QString& fromJid, const QString& body, const QString& subject);
            // OptionAccessor
            virtual void setOptionAccessingHost(OptionAccessingHost* host);
            virtual void optionChanged(const QString& option);
            //ActiveTabAccessor
            virtual void setActiveTabAccessingHost(ActiveTabAccessingHost* host);
            //ApplicationInfoAccessor
            virtual void setApplicationInfoAccessingHost(ApplicationInfoAccessingHost* host);
    
            virtual bool incomingStanza(int account, const QDomElement& stanza);
            void elementFromString(QDomElement& body,QDomDocument e, QString& msg, QString jid, QString resource = "");
            void nl2br(QDomElement& body,QDomDocument e, QString msg);
            void addPlus(QDomElement& body,QDomDocument e, QString msg, QString jid, QString resource = "");
            void addSubscribe(QDomElement& body,QDomDocument e, QString msg, QString jid, QString resource = "");
            void addHttpLink(QDomElement& body,QDomDocument e, QString msg);
            void addTagLink(QDomElement& body,QDomDocument e, QString tag, QString jid);
            void addUserLink(QDomElement& body,QDomDocument e, QString nick, QString altText, QString pattern, QString jid);
            void addMessageId(QDomElement& body,QDomDocument e, QString mId, QString altText,QString pattern, QString jid, QString resource = "");
            void addUnsubscribe(QDomElement& body,QDomDocument e, QString msg, QString jid, QString resource = "");
            void addDelete(QDomElement& body,QDomDocument e, QString msg, QString jid, QString resource = "");
            void addFavorite(QDomElement& body,QDomDocument e, QString msg, QString jid, QString resource = "");

    Краткость - сестра таланта... Только видимо авторы этого чуда эту пословицу не знают.
    Да и количество непонятных макросов нам тоже намекает.
    Ну и конечно же необходимость в таком страшном множественном наследовании с возможностью рандомных побочных эффектов тоже намекает нам о говноархитектуре. В общем не зря авторы Psi решили начать писать новый клиент.

    Запостил: Sauron, 01 Января 2010

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

    • 1)Говнокод в том, что слишком много методов? Тоесть плохая декомпозиция объектов?
      2)Слишком большое наследование? Мне кажеться в данном случае это не говнокод, а то методов станет ещё больше...
      3) Неизвестные Q_OBJECT и Q_INTERFACES?
      4)#define constTbold "tagbold" - название макроса хуже и менее понятное, чем у строки?
      Правильно?
      Ответить
      • 1. Да, надо было разбивать этот объект на несколько более простых и понятных, а не городить эти простыни
        2.Множественное наследование штука слишком опасная, нужно минимизировать его использование и уж точно не наследоваться сразу от 6 объектов. Мне вообще удается избегать его и ничего, жив, здоров.
        3.С ними всё прекрасно как раз, это чисто Qtшные фишки
        4.Макросы опять же зло, их плохо понимают анализаторы кода, они могут приводить к странным ошибкам, которые потом разгребать долго и упорно придется. Да и опять же в плане читабельности "шило на мыло". Ну и вроде как же договорились, что макросы должны писаться в ВЕРХНЕМ РЕГИСТРЕ.
        То есть по совокупности это тихий ужас.
        Ответить
        • 1. Вообще-то множественное наследование тут и является своего рода разбиением на простые и понятные объекты.
          2. множественное наследование - вполне нормальное выразительное средство. У него ещё и оверхеда нет, в отличие от, например, виртуальных функций.
          4. макросы действительно стоило бы заменить на char const *const, впрочем мало-ли как они ещё используются, может из них идентификаторы составляются?
          Ответить
          • Читаем с вики
            Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма.

            <a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1% 82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_% D0%BD%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%B E%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5">Вот</a> ссылка на всю статью. То есть само по себе оно может быть очень опасным, а такие вещи, как плагины, часто пишут не слишком опытные программисты. Поэтому нужно по возможности их отгораживать от путей, которые легко приведут к ошибке.
            Ответить
    • Как переводиться Psi?
      Ответить
    • с объектным дизайном очень плохо... +1
      Ответить
    • Там вообще тихий ужас в коде, сам знаю, давно хочу его переписать, но есть дела по важнее.
      Ответить
    • Миксины мы недавно обсуждали...
      Все люди делятся на 2 категории:
      1. те которые понимают преимущества (newschool)
      2. староверы (oldschool)
      Тех, кто активно пользуется, очень мало, так как постичь это мастерство очень сложно, поэтому они в 1 группе.
      Хотя в данном случае методов слишком много (миксин придуман для уменьшения их количества)...
      Ответить
    • - Ну да! А что? Давай, быстрей, пока никто не видит. Ой блин, по улице идет кто-то.
      Ответить

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