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

    −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
    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
    #include "property.hpp"
    
    class person {
    public:
       person() = default;
       ~person() = default;
    
       SETTER_PRIM(int, id);
       SETTER_FLAG(bool, merried);
       SETTER_ENUM(human, type);
    
       SETTER_PTR(int, next);
       SETTER_ARR(std::string, address, 3);
    
       SETTER_OBJ_LR(std::string,  name);
       SETTER_OBJ_CLR(std::string, name);
       SETTER_OBJ_RR(std::string,  name);
    
       GETTER_PRIM(int, id);
       GETTER_FLAG(bool, merried);
       GETTER_ENUM(human, type);
    
       GETTER_OBJ_LR(std::string,  name);
       GETTER_OBJ_CLR(std::string, name);
    
       GETTER_PTR(int, next);
       GETTER_ARR(std::string, address);
    
    private:
       int id;
       human type;
    
       std::string name;
       std::string address[5];
    
       bool merried;
       int* next;
    };

    https://habr.com/ru/post/459212/

    Запостил: kcalbCube, 26 Апреля 2022

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

    • Бог мой, да нахуя?!

      > int* next;
      Это, я надеюс, указатель на объект Person? да? да?

      >merried
      а, понятно
      Ответить
    • Приведите один премер зачем нужны тупые пустые геттеры и сеттеры
      Ответить
      • Брякпоинты ставить, если дебаггер тупой и не умеет останавливаться на записи в определённую область памяти.
        Ответить
        • в нативном коде такой проблемы нет
          поцы поддерживают сколько-то бряк железных, для всего остального есть муха цэцэ она же Int3
          Ответить
        • Или trace добавить, с дебаггером тоже иногда бывает сложно.
          Ответить
          • Скажите мне честно, коллега
            Вы джавист?
            Ответить
            • Сетевое взаимодействие, когда удаленное устройство отваливается по таймауту? Мышиная возня с перетаскиванием? Обработка длинных списков?
              Ответить
              • Прости, я тебя не понял
                Ответить
                • Случаи, когда использование отладчика (и даже брекпоинтов с условием и брекпоинтов на память) может оказаться бесполезным, и придется прописывать в программу qDebug() << QDateTime::currentTime() << ": Setting kokoko to " << m_kokoko << "!!!";
                  Ответить
                  • Приведи пример когда без геттера не отдебажить в С++

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

                        Боюсь что если к тебе придет старина Дейкстра, то ты охуеешь
                        Ответить
                        • > Не пиши сложный код

                          А что мне делать с легаси, где с одной стороны поработал трёхзвёздочный сишник, с другой опытный энтерпрайзный копипастер, а с третьей устроили локальную войну поборники С-с-классами и ModernC++?
                          Ответить
                          • Во времена Дейкстры не было С++, энтерпрайза и трехзвездочных. Да и легаси не было..:)

                            на самом деле я всё прекрасно понимаю, я и сам часто не могу прорваться через дерьмо без дебагера. Но это всегда _плохой_ признак.

                            Если код нельзя понять без дебагера, значит это плохой код.
                            Однако большинство кода в этом мире -- плохое
                            Ответить
                            • Иногда хороший код написать невозможно.

                              Представь себе: производство. На этом производстве есть конь-тролер. У меня в калькуляторе скорее всего стоит более быстрый и сбольшим объёмом памяти. Но у него есть одно преимущество — если бы он стоял в Терминаторе, то погружение в расплавленную сталь ему бы ничего не сделал. Да и попытка Сары расколотить его молотком потерпела бы неудачу, даже если её бы не остановили. И это хорошо, потому что эксплуатируется он приблизительно в таких же условиях.

                              Задача этого конь-тролера — предупреждать, если расчетные параметры происходящих процессов не совпадают с реальными. Для этого он постоянно рассчитывает эти теоретические параметры на основании происходящих процессов.

                              Физическая модель этих процессов — 20 страниц математических формул.
                              А теперь представь себе расчеты физических моделей численными методами, оптимизированными конкретно под эту модель конь-тролера. И часть вычислений заменили грубыми приближёнными, потому что иначе собаку пнуть не успевали.

                              Вот как тут написать понятный код?

                              И тебе нужно понять, в чём проблема — в недостаточной точности приближённых вычислений? В реализации алгоритма? В самой модели?
                              Ответить
                              • Взять язык для математики, и написать код на нем. А еще лучше попросить сделать это математиков. А затем покрыть миллиардом тестов.

                                А ты уверен, что тут тебе поможет дебаг?
                                Ответить
                                • > язык для математики
                                  Это какой? Он способен уверенно генерировать код для железок, частота которых по-моему до мегагерца не дотягивает, и у которых память килобайтами меряется?

                                  Там дикое битоёбство и экономия инструкций. Черная магия после которой 0x5f3759df кажется простым и понятным. Зато есть возможность полностью сдампить внутреннее состояние. Сиди и разбирайся, что происходило.
                                  Ответить
                              • > Представь себе: производство. На этом производстве есть конь-тролер. У меня в калькуляторе скорее всего стоит более быстрый и сбольшим объёмом памяти. Но у него есть одно преимущество — если бы он стоял в Терминаторе, то погружение в расплавленную сталь ему бы ничего не сделал.

                                ...
                                > Физическая модель этих процессов — 20 страниц математических формул.
                                > А теперь представь себе расчеты физических моделей численными методами, оптимизированными конкретно под эту модель конь-тролера. И часть вычислений заменили грубыми приближёнными, потому что иначе собаку пнуть не успевали.

                                А нахуя непосредственно сам контроллер со всеми этмии физическими ма-те-ма-тическими вычислениями ставить в какие-то хардкорные условия? Можно ж где-то разместить жирный контроллер, который всю ма-те-ма-тику посчитает, отправит результат по какому-то там говноинтерфейсу в тупой контроллер, который нужными ножками подрыгает по команде чтоб какое-то там говно переключить
                                Ответить
                                • У меня есть подозрение, что во время, когда это внедряли, это был жирный контроллер. А потом пошло «работает — не трожь» и «хер где мы ма-те-ма-тика для этих расчётов снова найдём».
                                  Ответить
                          • Трёхзвёздочник - это который void*** использует?
                            Ответить
                            • https://wiki.c2.com/?ThreeStarProgrammer
                              Ответить
                              • Ну кстати для этой говняшки есть же освеживатель воздуха.


                                PPetuh это указатель на питуха. Так что PPetuh* вроде как и однозвёздочный.

                                Я вот недавно совсем две звезды видал, кажется в COMе
                                Ответить
                                • > PPetuh это указатель на питуха.

                                  А может это двойной указатель на "etuh"?
                                  Ответить
                                  • У меня в контроллерах именование структур начинается с буквы "T". Поэтому etuha быть не может.
                                    Ответить
                              • Значит угадал
                                Ответить
                          • > А что мне делать с легаси, где с одной стороны поработал трёхзвёздочный сишник, с другой опытный энтерпрайзный копипастер, а с третьей устроили локальную войну поборники С-с-классами и ModernC++?

                            Ну я могу предложить несколько вариантов, например
                            1) Переписать нахуй это говно
                            2) Заставить кого-то другого с этой хуйней пердолиться
                            3) Сменить место работы
                            Ответить
                            • Легаси будет везде, лолич.
                              Кроме какого-то ебучего стартапа или контроллера.
                              Ответить
                            • ФАНТАЗЁР, ТЫ МЕНЯ НАЗЫВАЛА
                              Ответить
                        • Сейчас придёт ж123123 и скажет, что у него в контроллерах никаких логов нет
                          Ответить
                          • Вообще говоря у него есть UART обычно, туда вполне можно срать логами.
                            А вот дебажиться ему сложнее. Разве что через JTAG.. (я так думаю, но я не сварщик)
                            Ответить
                            • > А вот дебажиться ему сложнее. Разве что через JTAG..

                              Можно и по SWD. Можно в контроллер зашить специальную хуйню, которая бы позволяла прошивку отлаживать, ну например чтобы когда по UART прилетает байтик специальный, чтобы срабатывало прерывание и там бы сохранялся полностью стейт, и чтоб можно было ставить брейкпоинты, если можно писать в область памяти с инструкциями (т.е. вместо какой-то инструкции можно хуйнуть "goto инструкцию" на некоторое говно, которое остановит нормальное выполнение программы и напишет что-то по UART что вот типа этот брейкпоинт сработал), а потом можно продолжить, заменив эту "goto инструкцию" на то, что там было, и выполнить это. Т.е. технически можно и через UART отлаживать контроллеры, если память с инструкциями переписываемая.
                              Ответить
                          • Вообще-то есть. Я логами даже по TCP протоколу срал из контроллера по wifi.
                            Ответить
                            • Если у тебя будет segfault, то нихуя у тебя не успеет отправиться в лог, если высрать туда непосредственно перед падением
                              Ответить
                              • Если у меня segfault то сработает какой-то там обработчик segfault-а, который теоретически может содержать в себе некоторое говно, которое что-то куда-то отправит по UART-у
                                Ответить
                                • У меня вот есть сегфолт, даже стектрейс есть, даже в gdb вижу переменные. Но вот высрать куда-то асинхронно логи перед падением - проблематично. Только срать в stderr или в файл
                                  Ответить
                                  • > Но вот высрать куда-то асинхронно логи перед падением - проблематично. Только срать в stderr или в файл

                                    Нахуя тебе какая-то асинхронность перед падением? Вот допустим у тебя процесс в линуксе словил сигнал SIGSEGV или SIGBUS, SIGFPE, SIGILL (ту хуйню, которая приводит к аварийному завершению) и там ты назначил обработчик, который насрет в какой-то там пайп или файл некоторую хуйню через системный вызов write(). В чем проблема-то?
                                    Ответить
                                    • У меня асинхронная отправка логов. Я знаю место где падает, и хочу высрать дополнительные логи с информацией о контексте. Мне приходится делать это через cerr, а не через мой стандартный логгер.
                                      Ответить
                                      • Если твой стандартный логгер - говно, это проблема твоего стандартного логгера.
                                        Ответить
                                        • Сам ты говно. Он собирает пачку логов в памяти, сжимает их gzip-ом, когда накопилось достаточное количество или по таймеру, и отправляет на другой бекенд. Посколько программа крашится, отправить он нихуя успеет. А ты бы как сделал многопоточный логгер? Ах да, у тебя к контроллерах нет никаких потоков.
                                          Ответить
                                          • > Он собирает пачку логов в памяти, сжимает их gzip-ом, когда накопилось достаточное количество или по таймеру, и отправляет на другой бекенд.

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

                                                Почему? Можно срать в один пайп асинхронно. Например, можешь нахуячить в памяти lock-free очередь, в нее напихивать адреса, в которых строка которую надо насрать в лог. Когда твоя программа простаивает, эту хуйню можно отправлять по пайпу

                                                Что у тебя там тормозить будет?
                                                Ответить
                                                • Lock-free очередь работает в соседнем треде, верно? Как же она что-то высрать успеет, если остновной тред крашнет программу?
                                                  Ответить
                                                  • > Lock-free очередь работает в соседнем треде, верно? Как же она что-то высрать успеет, если остновной тред крашнет программу?

                                                    Основной тред в обработчике сигнала высрет всю очередь в другой процесс через пайп, и потом уже крашнет всё
                                                    Ответить
                                                    • Можно так, да.
                                                      Ответить
                                                    • пиздец вы сислог изобрели)

                                                      конечно жать логи надо в другом процессе
                                                      сама программа должна только логами срать

                                                      можно сделать как в евент логе в винде когда срется не текст а инт -- смещение в спец файле со всеми возможными сообщениями для данной программы
                                                      Ответить
                                • У меня в контроллерах нет никакого UART-а.
                                  Ответить
                                  • > У меня в контроллерах нет никакого UART-а.

                                    Какие-то у тебя странные контроллеры. GPIO хоть есть?
                                    Ответить
                            • > по TCP
                              Хоть бы #include "syslog.hph" написал, а не изобрел свой собственный лисапет...

                              А потом мы удивляемся, почему всякие китайские кунштюки управляются посредством немыслимого черезжопия, а простейшего SNMPv2 не поддерживают
                              Ответить
                    • > Приведи пример когда без геттера не отдебажить в С++

                      Придумать всякое можно... Ну да ладно, и без геттера обойдусь, одним сеттером.
                      class Urmom {
                      public:
                        const int weight;
                        void setWeight(int w)
                        {
                          // *(int *)weight = w;
                          *const_cast<int *>(&weight) = w;
                        }
                      };
                      Ответить
      • 1. А хули тут делать, сделаем обычную структуру с открытыми полями, у нас тут никакого поведения не будет.
        2. Ну разве что добавим два конструктора для удобства.
        3. А, вот еще можно сделать метод, который автоматически заполняет нужный элемент в массиве address. Ну и при этом заодно меняет поле type, а то сейчас эта проверка трех местах написана.
        4. А вот хорошо бы еще сделать, чтобы при заполнении поля type проверялся бы address.
        5. ???????
        6. Ой.
        Ответить
        • и как тут поможет пачка тупых геттеров-сеттеров?
          Ответить
          • 1. Добавляем в сеттер соответствующий код.
            2. Профит.

            Конечно, можно средствами IDE найти все обращения к полю (средство "поменять и смотреть где не компилируется") и заменить на геттер-сеттер.
            В общем, дилемма - либо предусмотреть, либо не оверинженирить. Тут уж по интуиции.
            Ответить
            • А, так мы про недоязыки типа Java

              В C# такой проблемы нет: нужно публичное поле поменять на Property и перекомпилировать
              Ответить
      • блядь, а за что деньги тогда платить будут?
        Ответить
        • за toString и hashCode
          Ответить
          • именно поэтому я за реверт фичи <<records>>
            Ответить
            • JEP 359?

              да, часть очарования уйдет из джавы конечно, не нужно больше будет писать тонны бойлерплейта тупого
              Ответить
              • вы просто ненавидите всё энтерпрайзное
                Ответить
                • Нет

                  Я обожаю пафосный энтерпрайз, по настоящему пафосный: с SOAP, ESB, OLAP, и BMPL.
                  Я ненавижу лишь наколенное говно из сорока девяти классов DTO с миллионом полей каждый, писанных вручную
                  Ответить
          • > за toString и hashCode
            Похоже на тост.
            Ответить
    • Не все петухи представлены

      https://gordonua.com/bulvar/news/luchshe-by-on-tyavkal-kak-payetochnyy-petuh-baskov-chem-vot-tak-vysralsya-efrosinina-vyskazalas-o-kirkorove-1605432.html
      Ответить
      • киркоров действительно какой-то запредельный пидарас даже для российской попсы

        когда упаковали навального и его навальнят, бедросыч радовался, и писал, что этот "берлинский пациент" сеет ненависть, и так ему и надо

        когда укры схватили медведчука, киркоров стал верещать, что это преследование по политическим мотивам, и оно, дескать, недопустимо
        Ответить
        • Я не хотел этого знать, просто выступал за разнообразие паюсных петухов, в котором наша сила.
          Ответить
          • >паюсных
            кстати, давно не ел паюсной черной икры
            Ответить
    • https://pbs.twimg.com/media/FRQaLkjWYAAdpOG?format=jpg&name=large
      Ответить
    • Короче, я решил окончательно стать прыщеблядью, и установить дебиан на рабочий ноут (сейчас у меня дебиан на домашнем ноуте и десктопе), и перечитываю understanding the linux kernel


      Но мне кому-то нужно отдать поддержку мастдая (винда и WSL особенно). А никто брать не хочет
      Что делать?
      Ответить

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