|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Oct 2012
Адрес: Hamburg
Сообщений: 22
|
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. Каково ваше мнение? |
|
|||||
Присоединяюсь. Тоже хочется посмотреть на реализацию пула команд.
__________________
Сам себе репортер |
|
|||||
Регистрация: Nov 2010
Сообщений: 497
|
А что вы подразумеваете под "command pooling"? Отправка команд пачкой на сервер или что-то еще? От этого будут зависеть ответы на все остальные ваши вопросы.
|
|
|||||
Вообще требования странноватые, на мой взгляд.
Цитата:
Цитата:
Цитата:
Цитата:
PS Вообще, в плане эксперимента, у меня получилась вот такая конструкция. Не претендую на истину в последней инстанции, но вроде бы подходит под определение "пулинг команд": 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() Запускать всегда через Да, единственное, что придется еще дописать - это свою реализацию IEventDispatcher, унаследованную от класса Command. Но, думаю, за этим дело не станет =)
__________________
...вселенская грусть Последний раз редактировалось gloomyBrain; 29.10.2012 в 13:50. |
|
|||||
Регистрация: Oct 2012
Адрес: Hamburg
Сообщений: 22
|
фреймвори (PureMVC, RobotLegs, mvcExpress) application logic идет в "Commnad" классы.
Я хочу иметь автоматический pooling для них. Добавлено через 57 минут Я имею в виду автоматическое Command pooling. сценарий:
Пользователь контролирует только <do your stuff>. Все остальное делает фреймворк. сценарий с асинхронностью :
Можно использовать finalize(). что лучше?
Я имею в виду Proxy зависимости. package { public class TestCommand extends Command { [Inject] public var proxyDependency:TestProxy; public function execute(blank:Object):void{ //... } } } Я не уверен в этом. Я могу представить себе сценарий, при котором в течение некоторого времени вы используете те же команды много .. после этого вам не нужны эти команды. (можно очистить pool). Это дополнительные функции. спасибо за пример! Я избегаю static классов, но использовать finalize() - интересная идея. |
|
|||||
Класс можно сделать и не статичным, просто, на мой взгляд, так удобнее запускать из любого места. Да и делать как-то иначе == писать больше кода. На счет lock/unlock - не совсем очевидно получается. Что будет если вызвать unlock до того как был вызван lock? В предолагаемом мной подходе есть 2 основные мысли:
1) optional pooling 2) контроль над использованием команд вне пула. Правда, второй пункт в пример не попал =) Доработанынй вариант выглядит так: 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!"); } } }
__________________
...вселенская грусть |
|
|||||
Регистрация: Oct 2012
Адрес: Hamburg
Сообщений: 22
|
Цитата:
Некоторые вещи делаются, чтобы сохранить контроль и ремонтопригодность. Silent fail, warning trace или Error throw... (еще думаю, что лучше.) Мне нравится Errors... Что вы имеете в виду? какой контроль? |
|
|||||
Регистрация: Oct 2012
Адрес: Hamburg
Сообщений: 22
|
Я сделал 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! package com.mindScriptAct.mvcExpressSpeedTest.controller { ... public class TestCommand extends PooledCommand { [Inject] public var testProxy:TestProxy; public function execute(params:Object):void { testProxy.doStuff(); } } } 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. } } } |
|
|||||
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
__________________
Отряд Котовскага |
Часовой пояс GMT +4, время: 13:12. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|