Показать сообщение отдельно
Старый 29.10.2012, 13:31
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 4  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Вообще требования странноватые, на мой взгляд.
Цитата:
user must have functions to disable/enable pooling on command. (for asynchronous execution)
Каким образом пул связан с асинхронностью? Понятное дело, что пока экземпляр используется, из пула его получить нельзя.

Цитата:
Command must be automatically removed from the pool if any of it's dependencies are changed/removed.
В моем понимании, команда может порождать другую команду, других зависимостей быть у нее не должно. Если мы считаем, что все команды берутся из пула - то очевидно что это требование излишне, слежение за жизненным циклом всех команд производится отдельно от кода самих команд.

Цитата:
Framework must have a function to clear command pool
зачем? =) Неужто команды (которые не должны хранить ни данных, ни состояния, ни ссылок) вдруг стали давать критическую массу в оперативной памяти?

Цитата:
OPTIONAL : automatically remove command from the pool after set time interval
Это тоже для меня загадка. Команда либо активна в данный момент, либо лежит в пуле и ждет, пока ее сделают активной. И так по кругу. Руками удалять ее из пула нет смысла, ИМО.

PS
Вообще, в плане эксперимента, у меня получилась вот такая конструкция. Не претендую на истину в последней инстанции, но вроде бы подходит под определение "пулинг команд":
Код AS3:
package
{
    import flash.utils.Dictionary;
    import flash.utils.describeType;
    import flash.utils.getQualifiedClassName;
 
    /**
     * Global command runner
     */
    public class Command
    {
        public function Command()
        {
            super();
        }
 
        private static const _classList:Dictionary = new Dictionary();
 
        public static function run(commandClass:Class, ...args):void
        {
            if (!commandClass) throw new ArgumentError("Parameter must be not-null!");
            if (!(commandClass in _classList))
            {
                var className:String = getQualifiedClassName(Command);
                var description = describeType(commandClass);
                var isInheritedCommand:Boolean = Boolean(description..extendsClass.(@type == className));
 
                if (!isInheritedCommand) throw new Error("Only Command-inherited classes are allowed!");
 
                _classList[commandClass] = new Array();
            }
 
            var pool:Array = _classList[commandClass] as Array;
            var command:Command = (pool.length ? pool.pop() : new commandClass()) as Command;
 
            command._pool = pool;
            command.run.apply(command, args);
        }
 
        private var _pool:Array;
 
        /**
         * Call this method to return this command instance to associated pool
         */
        protected final function finalize():void
        {
            _pool.push(this);
        }
 
        /**
         * Run command with specified arguments
         */
        protected function run(...args):void
        {
            throw new Error("Methot-override is supposed here!");
        }
 
    }
}
Что нам нужно делать, так это:
- отнаследоваться от этого класса
- оверрайдить метод run
- внутри метода run (или где-то еще, если команда асинхронная) не забыть вызвать finalize()

Запускать всегда через
Код AS3:
Command.run(CommandExample, "hello, world!")

Да, единственное, что придется еще дописать - это свою реализацию IEventDispatcher, унаследованную от класса Command. Но, думаю, за этим дело не станет =)
__________________
...вселенская грусть


Последний раз редактировалось gloomyBrain; 29.10.2012 в 13:50.