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

    +1

    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
    // File icontact.h
    // Describes a contact in the address book
    class IContact
    {
    public:
        virtual ~IContact();
        virtual void ... 
        ... 
        void setContact(const QString& contact);
        ...
    private:
        QString m_contact;
        // ... other fields ...
    };
    
    // File icontact.cpp
    void IContact::setContact(const QString &contact)
    {
        m_contact = contact;
    }

    "Ну и че тут непонятного?" (Senior software developer, 8+ years of experience)

    Запостил: salamon_style, 11 Октября 2019

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

    • показать все, что скрытоКонтакт внутри которого контакт?
      Ответить
    • > class IContact
      > QString m_contact;
      > void setContact(const QString& contact);
      Ох уж эти крестовые интерфейсы с ошмётками реализации…
      Ответить
      • куиик

        а что будет m_contact? он вэмбеддица в каждый файл, который его юзает?
        Ответить
        • В смысле? Нет, он будет во всех потомках IContact. Я сетую на отсутствие в крестах нормальных «интерфейсов» — или, скорее, на подобные вот монстры, мимикрирующие под интерфейсы.
          Ответить
          • Просто это надо было назвать не интерфейсом, а абстрактным классом.
            А если в классе нет полей, а все методы абстрактные - ну, тогда он и есть интерфейс, чем он ненормален?
            Ответить
            • показать все, что скрытоВ языке моей мечты вообще не будет "виртуальных" методов в классах.

              Либо ты Pure interface (по сути -- контракт), либо ты закрытый для наследования.

              За наследование реализации надо бить ебало и ссать в рот чуть менее, чем всегда.
              Ответить
          • Почему же? Чем не интерфейс из тех же C# или Java?
            class IContact
            {
            public:
              virtual ~IContact() = default;
              virtual const QString& name() const = 0;
              virtual const QString& secondName() const = 0;
            };

            Не язык плох, а те, кто на нем пишут
            Ответить
            • Ну да, моя претензия действительно относится скорее к интерфейсописателям. С другой стороны, отсутствие в крестах отдельной сущности «интерфейс» или «абстрактный класс» — вопрос достаточно дискуссионный.
              Ответить
              • показать все, что скрыто>абстрактный класс
                Да не нужно это, если это не pure abstract, а тогда он интерфейс (або протокол в терминах ObjC).

                Пушо наследование ВСЕГДА нужно заменять делегированием.
                Если хочется шаблонного метода -- значит параметризуй объект лямбдой с этой стратегией.

                В языке должен быть сахер для делегирования (как в котлине) а не блядское наследование.

                Самая педерастия в C# и Java, в том, шо там все открытое (а в жобе еще и виртуальное) по умолчанию.

                Долбоёб всегда может наследоваться от твоегоь класса (если ты явно это не запретил) и переопределить конктеный метод

                И сломать LSP как имнимум. А тебе потом это поддерживать.


                наследование реализации -- зло
                Ответить
            • показать все, что скрытоВ джаве и C# все таки тружно сделать интерфейс с полем.
              С другой стороны, абстрактный класс там можно сделать, и это, в обещм, плохо.
              Ответить
              • Сделал тебе интерфейс с ассенизационным полем.
                Ответить
          • Тут меня вырубило как этот класс юзать. Что такое m_contact? Почему метод у IContact::setContact, а не setName, к примеру? Мне туда можно передать "Петров" или надо какую-то специально отформатированную строку / JSON запихнуть? Чем думал человек, когда писал это?
            Ответить
            • показать все, что скрытоЕсли это действительно инторфейс, то юзать его, как в IDL написано и не иначе.
              Но вообще это имплементирующий кококласс.
              Ответить
              • Есть идея, как обойти примитивную капчу для нарегивания ботов?
                У меня надёжных только 3.

                Жухрай сокрушенно качал головой, но, увидя огорчение в глазах Павла, не раздумывая, отстегнул свой маузер: — Вот тебе мой подарок. Павел не сразу поверил, что ему дарят вещь, о которой он так давно мечтал, но Жухрай накинул на его плечо ремень: — Бери, бери! Я же знаю, что у тебя на него давно глаза горят. Только ты осторожней с ним, своих не перестреляй. Вот тебе еще три полные обоймы к нему.
                Ответить
        • показать все, что скрыто>а что будет m_contact?
          ничего не будет. В том месте где ты создашь его объект -- в том месте этот m и будет.
          Это же не код.

          Вот если бы ты сделал(а) реализацию (дефикацию) функции в .h файле, то она бы успешно вкопулировалась во всех сегменты кода всех объектных файлов (при условии что это класс, а не шоблоёбло)

          А мембер-то за чем?

          Жопень в этом говнокоде в том что

          * у контакта есть контакт
          * у интерфейса (майки с I называюит интефейсы даже в CLR) есть член. Это как если бы у девки был член. Кому-то может и ок, но вообще ничего хорошего.
          Ответить
    • показать все, что скрытоСиньоры порфаворы! С чего вы вообще взяли, что это интерфейс? Из-за кривой венгерки и публичного сеттера?
      Ответить

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