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

    +116

    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
    class DllContainer
    {
      DllContainer()
      {
        // тут грузятся дллки в количестве N.
        // LoadLibrary() + некоторые операции
      }
      
      ~DllContainer()
      {
        // FreeLibrary() и т.п.
      }
    
      template <class T>
      T* GetComponent(ComponentID id)
      {
        // аналог QueryInterface.
        // ищет компонент, проверяет можно ли статик_кастить
        // и вертает указатель нужного типа
      }  
    };
    
    class ComponentUser
    {
      void Method1()
      {
        DllContainer loader;
        SomethingDoer* comp = loader.GetComponent<SomethingDoer>(ID1);
        comp->DoSomething();
      }
      
      void Method2()
      {
        DllContainer loader;
        SomethingElseDoer* comp = loader.GetComponent<SomethingElseDoer>(ID2);
        comp->DoSomethingElse();
      }
      
      void MethodN()
      {
        DllContainer loader;
        ShitPerformer* comp = loader.GetComponent<ShitPerformer>(IDN);
        comp->PerformSomeShit();
      }
    };

    недавно обнаружил код примерно такого плана.
    крупный коммерческий проект...

    Запостил: g26g, 12 Мая 2010

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

    • Если DLL и прогу одним компилятором и с идентичными настройками делать, то всё не так плохо. Хотя dynamic_cast бы здесь больше рулил.

      >проверяет можно ли статик_кастить
      А это как?
      Ответить
      • dynamic_cast нельзя. точнее, можно, но не факт, что сработает :) собирается под разные платформы разными компиляторами.

        > проверяет можно ли статик_кастить
        > А это как?
        свой ртти.

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

      Мощно.
      Ответить
      • >Для каждого метода класса ComponentUser сначала подгружаются все либы, а потом выгружаются.
        Всё равно они кэшируются в системе, так что без разницы, но ГК.
        Ответить
        • то что можно не делать, лучше не делать...
          Ответить
          • В старых системах это не работает нормально. Там не кешируют, а темболее в любой системе в реестре есть ключик отвечающий разрешения выгрузки неиспользуемых библиотек, так что нужно делать.
            Ответить
    • Ну не компонентный С++ язычок. Лучше б C# взяли.

      > и вертает

      Оседелець детектед
      Ответить
      • ну С#ом как бе нельзя заткнуть любую дырку... в большом геймдеве ему просто не место, в казуальном и инди у него пока сомнительные преимущества... код вполне жизнеспособен, хотя получение компонентов я бы переписал, передавая ID как статик мембер класса, ну и loader вынести в статик...
        Ответить
        • > в большом геймдеве ему просто не место

          с чего бы это? потому что во всех дырках с++? вот раньше во всех дырках фортран и кобол были. где они теперь?

          > в казуальном и инди у него пока сомнительные преимущества

          почему сомнительные? как раз прекрасные. в инди ведь главное - логика (а не суперспецэффекты), а С# прекрасен для написании логики. в с++ много отвлекаешься на всякую постороннюю хрень.
          Ответить
          • для написания логики прекрасен Lua/Squirrel...
            в С++ ни на что не отвлекаешься, при должном подходе в нем есть все плюшки С#...
            Ответить
            • > для написания логики прекрасен Lua/Squirrel...

              Однако чтобы должным образом Луа прикрутить, нужно поебаться (видимо, без этого с++ не мыслят жизни). А в C# уже сразу садись и делай.

              > при должном подходе в нем есть все плюшки С#...

              При должном подходе можно писать объектно-ориентированно и даже компонентно-ориентированно и даже функционально на си. только вот всё это время будешь чувствовать себя пидарасом.
              Ответить
              • ГС на С++ пишется за день, если не устраивает std::shared_ptr<>... больше в C# плюшек нет...

                Хватит уже впихивать невпихуемое... в моих платформах нет свопа и гектаров памяти...
                у меня верхний лимит 30 мб/30 фпс... что может мне предложить С#?
                а если копнуть дальше то:
                PSP - 32-64mb
                iPhone - 128mb, для пользователя только 30mb (24 по требованиям эпла)
                PS3 - 256mb
                XBOX360 - 512mb
                сори, но не все пишут никому ненужные приложения для никому не нужных серверов...
                давай закончим этот спор...
                Ответить
                • > у меня верхний лимит 30 мб/30 фпс... что может мне предложить С#?

                  то же самое
                  Ответить
                  • при заметно меньшем уровне графики/производительности...
                    Ответить
                    • нет.

                      xna для xbox майкрософтовцы видимо в холодном бреду написали?

                      особо производительные места никто не мешает реализовать на си и вызывать через p/invoke (хотя мало когда надо). тогда всё будет упираться в память. но с памятью у сишарпа не так плохо. просто какбэ некоторые радуются тому, что сборщик мусора, и давай строгать объекты направо-налево. можно так не делать и памяти будет вдостаток.

                      я уже говорил, можно конфигурировать моно (стрипнуть при компиляции лишнее), чтобы влезало в 4 мб по памяти.
                      Ответить
                      • серьезных игр на ней нет... только инди разработки... все более серьезное пишется на С++ хотя бы из-за того что этот же код заведется потом на других платформах...
                        Ответить
                        • > хотя бы из-за того что этот же код заведется потом на других платформах...

                          тебе сколько повторять, что моно заводится под: иксбокс, пс3, виндовс, линукс, макос, айфон и ещё что-то.

                          Слышал про Unity3d? Там используется мона (для логики). В симс3 используется моно для логики.
                          Один хрен в языках подобного уровня любая 3д-библиотека это враппер вокруг сишного функционала, так что большей трагедии нет, что графика рисуется не самой моной (хотя подвижки есть, напр. Mono.SIMD).
                          Ответить
                          • Человек уже сказал, что ему мало памяти из-за сборщика мусора в некоторых устройствах. В любом случае расходы её там больше, как не старайся, а старатся любят не все в комманде. Значит не подходит...
                            Ответить
                          • ... для логики...
                            ... для логики...
                            для логики вполне хватает и LUA без JIT... так как она в худшем случае есть 10% фреймтайма... и этот показатель можно смело менять в довольно широких пределах, вызывая скриптовую часть реже чем каждый фрейм...
                            Ответить
                            • если делаешь тетрис - то может быть.

                              и под логикой я понимаю нечто большее, чем скриптики-триггеры
                              Ответить
                              • а вот в GSC так не думают, ибо S.T.A.L.K.E.R. явно не тетрис, а использует Lua... я думаю можно смело набрать десятка два ААА тайтлов, которые ее используют...
                                и при этом нет ААА тайтлов написанных на шарпе...
                                Ответить
                      • > и давай строгать объекты направо-налево
                        С# для этого и создавался... если начать думать (а предел у этих мыслей все равно есть, и он сильно отличается от результата этих же мыслей на С++), то лучше было сразу выбрать язык который даст пользу от этих размышлений...
                        Ответить
                • >ГС
                  Сборщик мусора?
                  Аббревиатура из двух букв, но обе из разных языков. :)
                  Ответить
                • > ГС на С++ пишется за день, если не устраивает std::shared_ptr<>... больше в C# плюшек нет...
                  ужасы какие говорите :)
                  кстати, shared_ptr<> уже разве в стандарте? насколько я помню, он только до tr1 продвинулся.
                  Ответить
                  • да, ошибся, он еще в tr1... обычно я пишу свой...
                    Ответить
                    • Я шаред_птр ещё не пользовался. Обычно тоже свой пишу.
                      shared_ptr использует подсчёт ссылок. Храняться кол-во ссылок на объект в указываемом объекте или где-то в отдельном map? Или ещё как-то?
                      Ответить
                      • я с ним не разбирался, я просто знаю что он предоставляет такой функционал...
                        Ответить
                        • Мне просто интересно, намного ли у него медленней выполняется работа, по сравнению с интрузивными смарт_поинтерами.
                          Если мапы использует, то это конечно плохо, медленно...
                          Ответить
                          • нет, он вроде просто оборачивает объект в хендлер, который имеет счетчик ссылок...
                            Ответить
                          • нет там мап. есть рефкаунтер, который аллоцируется отдельно и зовет deleter при исчерпании ссылок на шареный объект.
                            работает медленнее интрузива, но универсальнее сам по себе. обычно на общий перфоманс приложения операции с шареными указателями влияют слабо.
                            Ответить
        • >loader вынести в статик...
          Вы хотели static DllContainer loader;?
          Вынести его, например как Синглтон ввиде одного экземпляра. Зачем их 5000т штук.
          Ответить
      • > Ну не компонентный С++ язычок. Лучше б C# взяли.
        думали об этом :) пока не решились.

        > Оседелець детектед
        упс, мимо :)
        Ответить
    • взываю к КО, ибо в упор не вижу ГК
      Ответить
      • ну кроме частой загрузки/выгрузки
        не уверен правда что ето на что-то влияет
        Ответить
      • Говнокод в том, что используют передачу объектов через DLL небезопасным способом.

        КО занят. Пришлось ответить мне.
        Ответить
        • говнокод не в кросс-модульном общении. кастрированный интерфейс DllContainer тут тупо для того, чтобы пояснить контекст.
          Ответить
          • >говнокод не в кросс-модульном общении
            Да. Он в не корректном использовании кросс-модульной передачи интерфейсов.
            Ответить
          • Посмотрите в как в DX передают мнтерфейсы. Вот там более безопасно, хотя и не красиво.
            Ответить
      • Ещё сомнительна идея с ComponentID id. Тип укажу один, а ид другой...
        Ответить
        • ComponentID - ид компонента. компонент может предоставлять N интерфейсов.
          T - интерфейс.
          Ответить
          • А почему не сделать ComponentID статическим полем константой из интерфейса T? Намного безопаснее.
            Ответить
            • с безопасностью ни разу это не связано. продиктовано сие просто типом композиции - one component to many interfaces.
              Ответить
      • > ибо в упор не вижу ГК

        видимо
        > ShitPerformer
        Ответить

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