1. ActionScript / Говнокод #14079

    −152

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    protected function get_resource_getter(xml:XML,name:String):Function {
            try {
                var getter:Function = this["get_"+name+"_xml"] as Function;
    
                return function():int{ return getter(xml)};
            } catch (e:*) {}
            if(xml.attribute(name).length()==0){
                return null;
            }
            return function():int{ return get_resource_xml(xml,name)};
        }

    Задача стояла предельно простая: получить количество некоторого игрового ресурса.
    Автор подошел к решению неординарно.

    Запостил: strax, 07 Ноября 2013

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

    • Мэджик. Боюсь представить архитектуру которую должно такое обслуживать.
      Ответить
      • 50+ cинглтонов, коллбеки вместо событий, постоянное создание анонимных функций, etc
        Ответить
        • Каллбеки вместо событий, если прямыми руками делать, это очень кул.
          Ответить
          • а в чем разница?
            Ответить
            • В перфомансе. Нативные события тяжелы для кпу и памяти, и слабая связь не всегда нужна.
              Что касается реализации - нужено легкое универсальное решение чтобы не добавлять методы напрямую потому что это очень ограничивает.
              Ответить
              • Коллбеки, даже в прямых руках, очень запутывают код и усложняют его понимание в разы.
                Да и выигрыш по сравнению с нативными событиями не настолько существенен, чтобы жертвовать читаемостью.

                Самый приемлемый вариант - это вызов коллбека через интерфейс, то есть вместо
                doSomeAsyncStuff( callback:Function );

                делаем так:
                doSomeAsyncStuff( iCallback:ICallbackInterface );

                где
                interface ICallbackInterface
                {
                    function asyncStuffComplete():void;
                }

                Так получаем максимальный выигрыш в производительности и более-менее сохраняем читаемость.
                Ответить
                • Кстати, почему есть существенная разница в производительности между вызовом функции и вызовом метода?
                  Ответить
                  • потому что метод и функция вызываются в байткоде по-разному:
                    метод:
                    _as3_callproperty ClassName::methodName(param count:*)

                    функция вызывается через call:
                    _as3_getlocal <1> 
                    _as3_getglobalscope 
                    _as3_call (param count:0)

                    кстати, похожим образом вызывается метод по ссылке (var func = this.method):
                    _as3_getproperty ClassName::methodName
                    _as3_callproperty http://adobe.com/AS3/2006/builtin::call(param count:0)
                    Ответить
    • Узнаю ПХПаттерн "меджик геттер". Автор в прошлом увлекался?
      Ответить
      • моим хуем он увлекался.
        Ответить
      • Честно - не знаю. Слышал только, что авторы программировали на руби. Точно узнать кто именно писал - нет возможности, потому что репозиторий был перенесен, и большая часть кода находится в первом коммите (без сохранения истории).
        Ответить

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