Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [...] command pooling примеры в as3 фреймворке? (http://www.flasher.ru/forum/showthread.php?t=186134)

Deril_AS3 28.10.2012 22:31

command pooling примеры в as3 фреймворке?
 
Здравствуйте,

Может быть, вы знаете хороший пример command pooling реализации в каком-нибудь as3 фреймворке??

Я пытаюсь добавить эту функцию в mvcExpress... интересно, как это сделанна в других местах.

Я думаю необходимы эти требования:


- Command pooling is automatically activated by extending special command. (PooledCommand.as)
- 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.


Я думаю, что command pooling необходим в уровне фреймворкa.

Каково ваше мнение?

terbooter 28.10.2012 22:44

Присоединяюсь. Тоже хочется посмотреть на реализацию пула команд.

maxkar 29.10.2012 12:08

А что вы подразумеваете под "command pooling"? Отправка команд пачкой на сервер или что-то еще? От этого будут зависеть ответы на все остальные ваши вопросы.

gloomyBrain 29.10.2012 13:31

Вообще требования странноватые, на мой взгляд.
Цитата:

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. Но, думаю, за этим дело не станет =)

Deril_AS3 29.10.2012 15:52

Цитата:

Сообщение от maxkar (Сообщение 1101833)
А что вы подразумеваете под "command pooling"? ...

фреймвори (PureMVC, RobotLegs, mvcExpress) application logic идет в "Commnad" классы.

Я хочу иметь автоматический pooling для них.

Добавлено через 57 минут
Цитата:

Сообщение от gloomyBrain (Сообщение 1101855)
Каким образом пул связан с асинхронностью?

Я имею в виду автоматическое Command pooling.

сценарий:
  1. command execute is triggered. (reacts to message or executed directly)
  2. get/create command from pool.
  3. execute()
    1. ---start command---
    2. <do your stuff>
    3. ---end command---
  4. push command to pool.

Пользователь контролирует только <do your stuff>. Все остальное делает фреймворк.

сценарий с асинхронностью :
  1. command execute is triggered. (reacts to message or executed directly)
  2. get/create command from pool.
  3. execute()
    1. ---start command---
    2. <do your stuff>
    3. lock()
  4. not push command to pool - it is locked.
  5. ...
    1. ---asynchronous command function ---
    2. <do your stuff>
    3. unlock()
    4. ---end command---
  6. push command to pool - it is not locked.

Можно использовать finalize().

что лучше?
  • Force user use finalize() in all commands.
  • finalize all commands automatically, unless user optionally locks it. (for Asynchronous commands)


Цитата:

Сообщение от gloomyBrain (Сообщение 1101855)
...других зависимостей быть у нее не должно...

Я имею в виду Proxy зависимости.

Код AS3:

package {
public class TestCommand extends Command {
 
        [Inject]
        public var proxyDependency:TestProxy;
 
        public function execute(blank:Object):void{
                //...
        }
 
}
}

если proxyDependency удаляется - pooled TestCommand должны быть удалены.




Цитата:

Сообщение от gloomyBrain (Сообщение 1101855)
Руками удалять ее из пула нет смысла, ИМО

Я не уверен в этом.

Я могу представить себе сценарий, при котором в течение некоторого времени вы используете те же команды много .. после этого вам не нужны эти команды. (можно очистить pool).

Это дополнительные функции.


спасибо за пример!
Я избегаю static классов, но использовать finalize() - интересная идея.

gloomyBrain 29.10.2012 18:43

Класс можно сделать и не статичным, просто, на мой взгляд, так удобнее запускать из любого места. Да и делать как-то иначе == писать больше кода. На счет lock/unlock - не совсем очевидно получается. Что будет если вызвать unlock до того как был вызван lock? В предолагаемом мной подходе есть 2 основные мысли:
1) optional pooling
2) контроль над использованием команд вне пула.

Правда, второй пункт в пример не попал =) Доработанынй вариант выглядит так:
Код 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._finalized = false;
            command.start(args);
        }
 
        private var _pool:Array;
        private var _finalized:Boolean;
 
        private function start(args:Array):void
        {
            if (_finalized) throw new Error("Unable to run finalized command!");
            this.run.apply(this, args);
        }
 
        /**
        * Call this method to return this command instance to associated pool
        */

        protected final function finalize():void
        {
            if (_finalized) throw new Error("Command already is finalized!");
            _finalized = true;
            _pool.push(this);
        }
 
        /**
        * Run command with specified arguments
        */

        protected function run(...args):void
        {
            throw new Error("Methot-override is supposed here!");
        }
 
    }
}


Deril_AS3 29.10.2012 19:43

Цитата:

Сообщение от gloomyBrain (Сообщение 1101928)
Класс можно сделать и не статичным, просто, на мой взгляд, так удобнее запускать из любого места.

это правда. Но мы не делаем все для удобства, или скорости.
Некоторые вещи делаются, чтобы сохранить контроль и ремонтопригодность.

Цитата:

Сообщение от gloomyBrain (Сообщение 1101928)
Что будет если вызвать unlock до того как был вызван lock?

Silent fail, warning trace или Error throw... (еще думаю, что лучше.) Мне нравится Errors...



Цитата:

Сообщение от gloomyBrain (Сообщение 1101928)
2) контроль над использованием команд вне пула.

Что вы имеете в виду? какой контроль?

gloomyBrain 30.10.2012 11:48

Я имею ввиду ограничение на запуск команд. То есть "нельзя запустить команду никак, кроме как через пул"

Deril_AS3 30.10.2012 16:29

Я сделал command pooling прототип: https://github.com/MindScriptAct/mvc...ee/release_1.3

Результат выглядит хорошо!

Тест для сравнения - сценарий:

- send a message
- execute command with dependencies
- command updates proxy
- proxy send data change message
- mediator handles data change massage.

результат: Сколько действий вы можете сделать в 1 миллисекунду.

RobetLegs 1 dependency - 46 runs/1ms
PureMvc cammand 1 dependency - 113 runs/1ms
mvcExpress command 1 dependency, No pooling - 375 runs/1ms
mvcExpress command 1 dependency, With pooling - 472 runs/1ms

mvcExpress cammand 5 dependencies, No pooling - 227 runs/1ms
mvcExpress cammand 5 dependencies, With pooling - 457 runs/1ms


Мне еще нужно проверить, как command pool тормозит всю систему... Но результаты выглядят хорошо!

как это использовать: вместо extend Command - использовать PooledCommand!

Код AS3:

package com.mindScriptAct.mvcExpressSpeedTest.controller {
...
public class TestCommand extends PooledCommand {
 
        [Inject]
        public var testProxy:TestProxy;
 
        public function execute(params:Object):void {
                testProxy.doStuff();
        }
 
}
}

Asynchronous command:

Код AS3:

package com.mindScriptAct.mvcExpressSpeedTest.controller {
...
public class TestCommand extends PooledCommand {
 
        [Inject]
        public var testProxy:TestProxy;
 
        public function execute(blank:Object):void {
                lock(); // diasble autamatic pooling.
                var imageLoader:Loader = new Loader();
                imageLoader.addEventListener(Event.COMPLETE, handleImmageLoad);
                imageLoader.load(new URLRequest("example.jpg"));
 
        }
 
        private function handleImmageLoad(event:Event):void {
                // do stuff...
                unlock(); // pool command.
        }
 
}
}


Котяра 31.10.2012 01:48

http://www.as3commons.org/as3-common...roduction.html


Часовой пояс GMT +4, время: 08:47.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.