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

    +20

    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
    Ini ini(m_serviceProvider);
            if( ini.load( gameInputStream ) == false )
            {
                LOGGER_ERROR(m_serviceProvider)("StartupConfigLoader::loadGame_ Invalid load game settings '%s'"
                    , _gameIniPath.c_str()
                    );
    
                return false;
            }
    
        IniUtil::getIniValue( ini, "Project", "Name", _settings.projectName, m_serviceProvider );
        IniUtil::getIniValue( ini, "Project", "Company", _settings.companyName, m_serviceProvider );
        IniUtil::getIniValue( ini, "Project", "Codename", _settings.applicationSettings.projectCodename, m_serviceProvider );
        IniUtil::getIniValue( ini, "Project", "Version", _settings.applicationSettings.projectVersion, m_serviceProvider );
        IniUtil::getIniValue( ini, "Locale", "Default", _settings.defaultLocale, m_serviceProvider );
        IniUtil::getIniValue( ini, "Game", "ContentResolution", _settings.applicationSettings.contentResolution, m_serviceProvider );     
        IniUtil::getIniValue( ini, "Game", "FixedContentResolution", _settings.applicationSettings.fixedContentResolution, m_serviceProvider );
        IniUtil::getIniValue( ini, "Game", "PersonalityModule", _settings.personalityModule, m_serviceProvider );
        IniUtil::getIniValue( ini, "Game", "AlreadyRunning", _settings.alreadyRunning, m_serviceProvider );
        IniUtil::getIniValue( ini, "Game", "WindowModeCheck", _settings.applicationSettings.windowModeCheck, m_serviceProvider );
        IniUtil::getIniValue( ini, "Window", "Size", _settings.applicationSettings.windowResolution, m_serviceProvider );
        IniUtil::getIniValue( ini, "Window", "Bits", _settings.applicationSettings.bits, m_serviceProvider );
        IniUtil::getIniValue( ini, "Window", "Fullscreen", _settings.applicationSettings.fullscreen, m_serviceProvider );
            IniUtil::getIniValue( ini, "Window", "MaxFPS", _settings.maxfps, m_serviceProvider );
        IniUtil::getIniValue( ini, "Window", "VSync", _settings.applicationSettings.vsync, m_serviceProvider );

    Это оттуда уже другой. Они все сговорились что-ли? Ынтерпрайз головного мозга.
    PS: boost::property_map не осилил.

    Запостил: LispGovno, 31 Января 2014

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

    • serviceProvider головного моска
      Ответить
    • > IniUtil::getIniValue(ini, ...)
      Отличное использование ООП. Да еще и возвращает результат через анус (видимо ради type inference).
      Ответить
      • А в новом Ц++ добавять zipWith, и код чудесно превратится в:
        HaskellToCPP::zipWith(::std::bind(IniUtil::getIniValue, ini), ::std::vector<::std::string>(

        И тут писатель задумается над списками инициализации, и поймет, что нужно ждать следующего обновления стандарта.

        ЗЫ. А помните как в конце девяностых было круто слать анимированые сообщения в статус-баре браузера, типа:
        .:::you are the 21'st visitor:::.
        Ответить
    • Ну может просто старый код просто или написано новичком, а никто не проконтролировал. Теперь все используют. Переписывать то лень.
      Ответить
    • с каких пор boost::property_map является new-free решением?
      Ынтерпрайз головного мозга - это когда такие хомячки как ты, постят всякую срань ни разу не задумываюсь почему было написано так. Удачи тебе в твоем колесе )
      Ответить
      • А зачем нужно new-free решение где-то кроме горячих циклов? А в частности - зачем оно нужно при чтении конфига, которое всяко идет один раз за жизнь проги.
        Ответить
        • есть такая система как marmalade, и разные мобильные решения, на которых new-free решения очень полезно. Даже для ini фаилов, например можно также там найти xml sax parser который тоже new-free это было сделано по фитбеку клиента, раньше был какойто популярный xml parser и он читал xml локализации ~1 минуту(такая специфика мобилок) - new-free 0ms. На PC что то, что то давало примерно 0ms. Такие вот пироги с картошкой.
          Ответить
          • А из-за new ли так тормозил старый парсер? :)

            P.S. Что-за мобилки такие тормозные и умеющие в с++, явно же не андроид? Старенький симбиан? И какой размер конфига?
            Ответить
            • именно из за new, std::map + std::string беспощадны к new.
              там все плохо с new + free,
              ты не поверишь это бы iPad1
              Ответить
              • > там все плохо с new + free
                Ну я погуглил немного сейчас. Куча народу жалуется на тормоза мармеладного аллокатора. Он походу тупо загибается от сильной фрагментации, которую ему устраивают стринг и мап.

                Так что я верю ;)
                Ответить
                • Кстати, а жавочный / донтетовский гц умеет дефрагментировать память? И когда он это делает?
                  Ответить
                • Кстати, все СТЛ контейнеры и, вроде как, бустовские умеют в кастомные аллокаторы.
                  Если отожрать себе пул памяти при запуске и реализовать в нём свою суперэффективную систему выделения памяти для дерева конфигов, это решит проблему?
                  Ответить
                  • В property_tree похоже нет такой возможности. Кстати, аллокатор, передаваемый в шаблон, не видел нигде кроме container.
                    Ответить
                  • Если сможешь реализовать - то да ;)

                    Но это же, имхо, на порядок сложнее, чем sax'ом распарсить.
                    Ответить
                  • Считай что практически не возможно. Во много раз надежнее и проще написать свой дом или сакс
                    Ответить
                    • > написать свой дом
                      Воспитать сына и посадить дерево.

                      Кстати, а ведь в старых добрых аллокаторах либц и мсвц нет такой адской просадки от фрагментации. У них поди несколько фрилистов под разные размеры, чтобы меньше сканить при поиске дырок?
                      Ответить
                      • Воспитать дерево, посадить сына.
                        Ответить
                      • Да наверняка в оймухе тоже используется это. Кеширование цпу только у них говно. Любой проход по листу приводит к печали вселенской.
                        Ответить
                        • > оймухе
                          Дык у мармеладки судя по докам свой велосипедный аллокатор. Отдельный пул указанного в конфиге размера и все такое. Так что походу тормозить под подобной нагрузкой он будет где угодно, и от железа мало что зависит.
                          Ответить
                          • То есть это горе от ума глупости?
                            Ответить
                            • Да не, есть вероятность, что на меньших нагрузках и фрагментации он работает пошустрее libc'шного. Ради этого его поди и запилили.
                              Ответить
                        • Насчет ARM'а и нормального аллокатора вот что пишут:
                          On a crappy ARM board with a single core glibc can do 300 000 malloc/free pairs per second.
                          Ответить
                    • >сакс
                      Кстати, какого хрена люди юзают SAX (push)? Ведь pull-парсер не менее эффективен, а код выглядит не как говно, а как нормальный рекурсивный спуск.
                      Ответить
            • размер довольно большой 6к строк xml
              Ответить
      • У тебя такой длинный конфиг? Он каждый кадр считывается и сохраняется на диск? Нет? Тогда это нафиг не сдалось.
        Ответить
        • А если каждый кадр, то у тебя явно другие проблемы. С головой и с временем работы диска. На фоне его времени работы ты даже и не заметил бы нью.
          Ответить
          • Диск-то закешируется системой.
            Ответить
    • > property_map
      Ты хотел сказать property_tree?
      Ответить
      • Я их путаю. Проперти мап не позволяет создавать под ноды, а трии этого недостатка лишен?
        Ответить
        • tree - это комбайн-конвертер для популярных форматов конфигов. map - кусок ускорь.граф, написаннай для абстрагирования способа доступа к свойствам вершин, ребёр, всего графа.
          Ответить
    • показать все, что скрытоКакой багор )))
      Ответить
    • Как можно одновременно использовать сервислокатеры и не признавать ооп?
      Ответить
      • Лицемерие моралфагов хорошо видно у противников абортов (про-лайф). Если у такого противника (вернее, противницы) случается незапланированная беременность, они таки делают аборт, несмотря на свои убеждения.

        lurk
        http://lurkmore.to/_/55784#mws_7RODybD
        Ответить

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