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

    +159

    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
    void AClass::registerApplication( int pCaller )
    {
      if ( mRegistry == NULL )
      {
        // we will be the first application in registry
        mRegistry = createRegistryElement( pCaller );
      }
      else
      {
        // there are other applications already registered
        // first create registry entry
        Application *lApplication = NULL;
        lApplication = createRegistryElement( pCaller );
    
        // put entry in front
        lApplication->mNext = mRegistry;
        mRegistry = lApplication;
      }
    }

    добавляем новый элемент в односвязный список. mRegister голова списка. кто не видит говна - идти читать матчасть.

    Запостил: Dummy00001, 22 Июня 2011

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

    • Не хватает отсутствия велосипедов, например STL.
      Не хватает многопоточной синхронизации?
      Ответить
      • :)

        подсказка. добавление в односвязный список можно делать совсем без if'ов.

        слегка подразжую: что произойдет в else ветке, если mRegistry будет NULL?
        Ответить
        • >подсказка.
          >слегка подразжую: что произойдет в else ветке
          Зачем писать велосипед с квадратными колесами, если уже есть с круглыми? Берите STL\QT\BOOST или ещё откуда угодно и используйте.
          Ответить
          • там используется нестандартный аллокатор памяти: записи не всегда лежат в хипе, но также и иногда в sysv shm (что бы к ним можно было доступатся из многих процессов).

            поинтеры там нестандартные используются - но я это говно высокоэтажное перед постом сюда убрал. оно ни смешно, ни загадачно, ни интересно - а просто говно.
            Ответить
            • >там используется нестандартный аллокатор памяти
              Не оправдание.
              1)В списке не обязан храниться сам элемент, можно, например, указатель или врапер.
              2)STL, как и другие библиотеки, позволяет указывать свои аллокаторы.
              3)В конце концов, всегда в С++ можно переопределить operator new.

              >(что бы к ним можно было доступатся из многих процессов)
              Тут не видно, но многозадачная синхронизация на добавление элементов списка точно есть?
              Если в между строками
              lApplication->mNext = mRegistry;
              mRegistry = lApplication;
              произойдет переключение задач, то это будет эпичный фейл.
              Ответить
          • STL\QT\BOOST плохи тем, что многое тянут и не дают полного контроля над происходящим + зависимость от особенностей и багов конкретных реализаций + зависимость от навязываемых архитектур (напр. как в QT - там же целый клубок). Не даром многие серьёзные фреймворки перевелосипедивают свои контейнеры.
            Я вот в душе минималист и перфекционист, я лучше завелосипедю свой маленький контейнер, чем потяну в проект мегабайты какого-то говна, над которым ещё плясать надо, чтобы скомпилировалось.
            Ответить
            • Забавно... Я вот в душе минималист и перфекционист, я лучше воспользуюсь одним контейнером на весь проект, чем воспользуюсь 10ком практически одинаковых контейнеров по всему проекту.

              >10ком практически одинаковых контейнеров
              Фактически мне это напоминает обычную копипасту новичков, только скрытую.

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

              Я имею введу семантические различия в контейнерах, а не синтаксические или прочие, например list и vector - семантически разные контейнеры.
              Ответить
              • Не понял, что ты тут написал, но я сторонние с++ библиотеки не использую. Мне оно не надо. Довольствуюсь с-библиотеками. Как-то особо других и нет в том, чем занимаюсь.
                Ответить
                • Какие вы знаете стандартные библиотеки контейнеров в C?
                  Ответить
              • Вообще код, использующий stl и boost, очень трудно читать, уж больно он вырвиглазный и перлоподобный.

                В Qt отличный дизайн, но это слишком тяжеловесная dependency.
                Ответить
                • При чём тут вообще Qt?
                  Ответить
                  • см. выше LinuxGovno: "Берите STL\QT\BOOST или ещё откуда угодно и используйте"
                    Ответить
            • Так зачем вам C++? пишите на C. Это идеальный язык для продуктивных минималистов и перфекционистов. )
              Линус вон внушает (http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918), что давно пора
              # cat /lang/c++ > /dev/null
              # cat /lang/c  > /dev/head
              Ответить
              • >Линус вон внушает
                ># cat /lang/c++ > /dev/null
                ># cat /lang/c > /dev/head
                Старый маразматик и консерватор... Замедляет развитие ОС... :(
                Ответить
                • Да, это "C-hacker syndrome" (http://warp.povusers.org/OpenLetters/ResponseToTorvalds.html). А ядро он почти не пишет, мне кажется. Только коммиты апплаит и версии назначает )
                  P.S. Юзайте Haiku, там всё на С++.
                  Ответить
                  • Линус уже не тот, допустил тивоизацию со своим тщеславием и GPLv2
                    Ответить
                    • GPLv2 не Линус написал, если что.

                      А если бы не тщеславие Линуса — было бы ядро под BSD или MIT, с аналогичным развитием драйверов. Тут уж о тивоизации говорить смешно.
                      Ответить
                      • > если что
                        он открыто одобряет тивоизацию
                        Ответить
                        • Помешать-то не сможет. Остаётся расслабиться и получать удовольствие.
                          Ответить
                  • Что отталкивает в линусе, то что он начинает кидать говно в оппонента с первых строчек сообщения, иногда совершенно не аргументировано.

                    Статься доставляет. Написано правильно, в начале вежливо, а когда позиция целиком опровергнута появляются строчки "The amount of bullshit he writes, once again, is just amazing" : )
                    Ответить
              • >Так зачем вам C++? пишите на C. Это идеальный язык для продуктивных минималистов и перфекционистов. )

                в с++ шаблоны и виртуальные функции очень полезны. а остальное -- фуфло, особенно стандартные классы. то бишь, если язык чё-то предлагает, это не значит что нужно абсолютно всё тащить в рот.
                Ответить
        • Этого мало для говнокода.
          Ответить
    • Можно узнать тип mRegistry?
      Ответить
    • должно быть

      void AClass::registerApplication(int pCaller)
      {
      	Application *temp = mRegistry;
      	mRegistry = createRegistryElement(pCaller);
      	mRegistry->next = temp;
      }

      ?
      Ответить
      • естественно.
        Ответить
      • Здрасте Вам, macGovno.
        Ответить
      • А что будет, если createRegistryElement вернёт NULL? Привет говнокодеру, короче.

        Application* AClass::registerApplication( int pCaller )
        {
        if ( Application *lApplication = createRegistryElement( pCaller ) ) {
        return mRegistry ? lApplication->mNext = mRegistry, mRegistry = lApplication : mRegistry = lApplication;
        };
        return NULL;
        }

        Бляя.. Ну и нотация. Уволил бы нах.
        Ответить
        • Ваш код трудночитаем. А про обработку ошибок в оригинальном ГК ничего не сказано. Не надо строить домыслов.
          Ответить
          • ??? Трудно? Вы как STL-то понимаете? Не говоря уже о бусте.

            В многопоточности еще нужно ввести и ожидание, где первое событие - это прерывание приложения, а второй - освобождение списка, или тупой лок. Ну или семафор, пофиг.

            А программист от говнокодера отличается тем, что обрабатывает все и возможные реакции, а не тупо пишет a = new (...); a->c = n; Типа памяти до хрена. Допусти такого до тонких или встроенных клиентов - похоронит же все. Вот пример настоящего говнокодера, не стесняющегося понтово публиковать свой говнокод.
            Ответить
            • Программист от говонокодера отличается тем что пишет читаемый и поддерживаемый код.

              И от говнокоментатора он отличается тем, что не делает предположений на пустом месте. Вы написали
              > А что будет, если createRegistryElement вернет NULL?
              Это ваши фантазии и предположения. createRegistryElement может никогда не возвращать NULL by design. Также как может бросать исключение в случае ошибки.

              Ваша поправка высосана из пальца и к говнистости оригинального говнокода отношения не имеет.
              Ответить
              • >Программист от говонокодера отличается тем что пишет читаемый и поддерживаемый код.
                От себя добавлю, рабочий в большинстве ситуаций.
                Ответить
              • "By design" - отмазка говнокодера.
                Ответить
                • Про исключения тоже "отмазка говнокодера"? Будем дальше неаргуметировано выёбыватся? или ответим по существу?
                  Ответить
                  • А где спецификация исключений? By design и типа в модели?
                    Ответить
                    • Вы опять говорите хуйню не имеющую отношение к реальности. Если вы не знаете чем спецификации исключений плохи и почему их никто не использует, то это ваши проблемы, которые усугубятся при выходе нового стандарта, где спецификации исключение помечены как deprecated.
                      Ответить
                      • Короче мне фиолетово. Не проверять возвращаемые значения и ссылаться на by design - признак говнокодера. Удачи.

                        P.S. Спецификацию исключений обязательно декларируют - признак хорошего тона a::b /* throw .. */
                        Ответить
                        • 1.
                          > Короче мне фиолетово.
                          Фиолетово на стандарт? Без комментариев.

                          2.
                          То что творится в вашей голове - это просто невообразимый пиздец. Если я написал функцию которая не возвращает 0 никогда, задокументировал это поведение и пользуюсь им - то это говнокод?

                          3.
                          Спецификации исключений как минимум бесполезны. Даже из зарегистрированного unexpected_handler можно разве что завершить приложение. Ни о каком graceful recovery не может быть и речи. А например в шаблонах они просто вредны. Кто знает что бросит тип использованный клиентом?

                          Признаком хорошего тона Спецификации исключений являются только в вашей голове. Все ведущие специалисты не рекомендуют их использовать.
                          Например Герб Саттер:
                          http://www.gotw.ca/gotw/082.htm

                          4.
                          > Удачи.
                          Уже сливаетесь? Печаль... Ато бы повеселили посетителей сайта ещё вашими глупостями. На то ведь и говнокод : )
                          Ответить
                          • Человече, если Вы ссылаетесь на "исключения", то где try/catch блок, говнокодер вы эдакий?
                            Ответить
                            • То есть вам действительно фиолетово на стандарт? И наплевать на рекомендации Саттера?

                              Мне вас жаль : ( Так уж и быть объясню вам неразумному: Трай-кэч там где можно обработать ошибку и восстановить ход выполнения прорамы. Это место не обязано совпадать с функцией registerApplication.
                              Ответить
                              • Батенька, Вы не только плохой программист, но еще и плохой собеседник. Не нужно думать за меня.

                                Вы, видимо, никогда не работали на больших проектах, где десятки людей много лет пишут одну систему - что дали, то и пишут. Суть в том, что программист обязан думать в рамках функции, как о замкнутой системе. А by design - это ему модель дали, кого вызывать и кого звать, а не рассказали, что "ниможыт вернуть нуль!!!111". Программист обязан обработать все и возможные исключения и ошибки. А Вы, уж простите, пытающийся выкрутиться говнокодер.

                                За сим прощаюсь.
                                Ответить
                                • Вы уже второй раз прощаетесь, проститесь уже окончательно и перестаньте писать глупости.

                                  Думать за других как раз пытаетесь вы. Программист обязан Реализовать порученный ему модуль в рамках технического задания. И сделать его поддерживаемым и читаемым.

                                  Вылетает исключение - поймай его в подходящем месте до интефейса, не можешь/не нужно сделай исключение частью интерфейса - задокументируй.

                                  Вы видимо слишком много потратили времени в ваших "больших проектах". И представления об дизайне и архитектуре системе подменили парой говнокодерских правил типо "всегда лови исключения в каждой функции". Вы не умеете пользоваться инструментами, о которых разговариваете.
                                  Ответить
                                • Да и ещё одно:
                                  > программист обязан думать в рамках функции, как о замкнутой системе

                                  Вы вообще с модификаторами доступа знакомы? Частная функция тоже обязана это делать? Функции класса спрятанного от клиента тоже вам обязаны?

                                  По вашим кусочкам кода и комментариям складывается ощущение что вы не знакомы с элементарным ООП. Отсюда и перлы про "функцию как замкнутую систему", отсутствие представления об exception safety, желание переплести код отвечающий за нормальное выполнение программы с кодом отвечающим за обработку ошибок.
                                  Ответить
                                  • Привет. :)

                                    Вы так ничего и не поняли. Только выкручиваетесь. Я кривовато, но пытаюсь до Вас донести парадигмы defensive programming. То есть крайне необходимо вставлять код обработки "невозможных" случаев, которые теоретически не должны случиться, но из-за косяков или рантайм сбоя где-то в другом участке программы (Вы же не один пишите? Железки чего, не сбоят? Стек кармически не портится?) - случаются. Кто знает, что там Пупкин, уволившийся год назад написал? И вроде модель говорит, что невозможно - ан нет...

                                    Кстати судить по двум строкам об уровне - это мощно. Внушает. Вангой в свободное время не подрабатываете? :)
                                    Ответить
                                    • Ключевое слово в вашем комментарии -- кривовато. Вас очень сложно понять, вы не называете вещи своими именами.

                                      Про вангу замечание совершенно не по адресу, первая оценка уровня было от вас и на мои три строчки кода. Ещё и с предложением "убивать нах".

                                      А оголтелое defensive programming до добра не доводит. То есть наличие чудака, который способен написать
                                      void* operator new (std::size_t size, void* ptr) throw();

                                      Не оправдывает повсеместное использование конструкций
                                      class A *a = new A;
                                      if(a) {
                                      //
                                      }

                                      Эти конструкции настолько засрут код, что поддерживать и искать ошибки станет невозможно. Это как носить стальной зонтик, вдруг метеорит упадёт.

                                      Такой подход может быть оправданным, но в очень редких случаях.
                                      Ответить
                                      • Очень редкие случаи - это высококритическое ПО, встроенное, тонкие клиенты и т.п. Кроме того, я глубоко убежден, что проверка возвращаемых значений и входных параметров - есть благо. А ловить рантайм исключения - есть зло. :)
                                        Ответить
                                        • Ну так и начинайте посты со слов "А вот у нас когда КБ, когда пишут ПО для лунохода..." А у людей пишущих прикладное ПО задачи и цели совсем другие.

                                          С такими убеждениями вам надо писать на пуре ц. В ц++ ваши убеждения идут в разрез с общепирнятыми практиками.
                                          Ответить
            • Кстити, может кто объяснит что не так в строчках
              a = new myClass;
              a->c = n;
              при условии конечно что в myClass не переопределён operator new со спецификацией throw() ?
              Ответить
              • Функция new, стандартная и переопределенная, не гарантирует возврат объекта. Конструктор/деструктор объекта может самостоятельно и своим способом резервировать и дерезервировать для себя память. Результат, понятно, не гарантирован. И т.п.
                Ответить
                • 5.3.4.13:
                  unless an allocation function is declared with an empty exception-specification (15.4), throw(), it
                  indicates failure to allocate storage by throwing a bad_alloc exception (clause 15, 18.4.2.1); it returns a non-null pointer otherwise.
                  Ответить
                  • Старые компиляторы до сих пор возвращают NULL. Почувствовал себя динозавром. :/
                    Ответить
                • Тоесть в 99.99% что стандартная что переопределённая allocation function кинет bad_alloc и a->c = n; не выполнится.
                  Ответить
            • Ну, допустим, при неудаче new до a->c вы уже не дойдёте.
              Ответить
    • показать все, что скрытоЭто не список, это стэк.
      Ответить
      • Стек имеет семантику: последним элемент вошел - первым вышел.
        По данному куску кода проверить порядок выхода элементов из контейнера мы не можем.
        Может они вообще никогда оттуда не выходят до завершения приложения.
        Ответить
    • Поглядев на код сразу подумалось, что это хвост, с потерей указателя, а нафига чистить память, вот в библиотеках gnome тоже память нифига не чистится, даже в офф доке прямо и написано, нафига чистить, если по завершению все вычистится, правда с тех времен гномские либы не юзаю.
      Ответить
    • Код так себе, не тянет на говнокод, но каков флейм!
      Ответить
      • Непроизвольно получилось, слово за слово.
        Мне в обсуждении больше всего доставило что в двух самых длинных лесенках говорилось примерно об одном и том же, только с разных сторон.
        Ответить
        • Я получил большое удовольствие. Буду заглядывать, вдруг будет продолжение?
          Ответить
          • Заглянут ещё элитные программисты -- будем учить дальше. Может сам Линус? Но врят ли он русский знает : (
            Ответить
    • MACGovno
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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