![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jan 2011
Сообщений: 2
|
В книге "ActionScript 3 Design Patterns" увидел пример использования этого шаблона - вызов сообщения по таймеру.
На его основе я попробовал сделать своё - вывод сообщения по щелчку мыши. В дальнейшем хочу сделать таким способом перетаскивание объектов на экране. Но ничего не получается, флэш при компилировании выдаёт ошибку "TestInterfaceOne.as, Line 38 1136: Incorrect number of arguments. Expected 1.". Вот сам код: IDrag.as DragCommand.as package { class DragCommand implements IDrag { var dragReceiver:DragReceiver; public function DragCommand(rec:DragReceiver):void { this.dragReceiver = rec; } public function execute():void { dragReceiver.action(); } } } DragReceiver.as package { import flash.events.*; import flash.display.*; public class DragReceiver extends Sprite { function action() { trace("hit!"); } } } DragInvoker.as package { import flash.display.*; import flash.events.*; class DragInvoker extends Sprite{ var currentCommand:IDrag; public function setDragCommand(c:IDrag) { this.currentCommand = c; trgt.addEventListener(MouseEvent.CLICK, this.trigerPressed); } public function trigerPressed(event:MouseEvent):void { currentCommand.execute(); } } } TestInterfaceOne.as package { import flash.display.*; import flash.events.*; import flash.geom.*; public class TestInterfaceOne extends MovieClip{ public function TestInterfaceOne(){ /*Для удобства восприятия я убрал код вызова мувиклипов в сцену*/ var rec:DragReceiver = new DragReceiver(); var concCommand:IDrag = new DragCommand(rec); var invoker:DragInvoker = new DragInvoker(); invoker.setDragCommand(concCommand); invoker.setTriger(); } } } |
|
|||||
|
Регистрация: Aug 2010
Адрес: Харьков, Украина
Сообщений: 42
|
Думаю, 38-я строка не помешала бы.
Мне, например, ещё неясно, что такое "invoker.setTriger();", где такое есть?
|
|
|||||
|
Modus ponens
|
На сколько я это себе предствляю, этот шаблон происходит от ограниченности Java, в котором исполняемый код нельзя передать по ссылке. В AS3 в нем необходимости я никогда не замечал.
Т.е. если мы назовем Function - Command, а apply / call заменим на run / execute получим то же самое, только уже встроенное в плеер.
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 21.01.2011 в 20:20. |
|
|||||
|
@wvxvw, я правильно понимаю что ты рекомендуешь не использовать GoF Command, а просто дёргать нужный метод по ссылке?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
2wvxvw: Команду можно параметризировать, а указатель на функцию - нет.
Кроме того, все таки этот паттерн, это не только Callback... А нечто большее... Хотя, конечно, в некоторых случаях, можно обойтись и функцией.
__________________
Искренне Ваш, Джек. |
|
|||||
|
Modus ponens
|
Ну, как я понимаю из объяснения вики:
Цитата:
package { /** * ... * @author wvxvw */ public class Command { private var _params:Array; private var _method:Function; public function Command(method:Function, ...params) { super(); this._method = method; this._params = params; } public function run():* { return this._method.apply(null, this._params); } } } ![]() Да, и судя по описанию, этот шаблон в общем случае в AS3 реализовать не возможно т.как у функции может не быть имени ![]()
__________________
Hell is the possibility of sanity |
|
|||||
|
Это всего лишь один из примеров реализации...
Вот тут много ссылочек и примеров на тему http://seregaborzov.wordpress.com/20...mmand-pattern/ И коль скоро есть команды, зачастую их реализация несколько сложнее, чем указатель на функцию и массив ее параметров... P.S. Как один из примеров. У нас есть некоторая рпг-ка... Там есть всякие заклинания и прочяя ерундень... Любое заклинание содержит в себе команду, которая проделывает реальное действие. А сами команды вообще описываются в XML например или JSON или еще как то... Ну например так: Т.е. FireBall - id описанной команды DealDamage - класс команды, написанный на AS damage - одно из свойств класса DealDamage... И как такое реализовать с помощью фунцкии? А возвращать команда ничего не должна... Ну или boolean, максимум... Хотя это тоже лишнее, потому что команда может выполняться отложено, но пользователь об этом знать не должен...
__________________
Искренне Ваш, Джек. Последний раз редактировалось JackFromChaos; 21.01.2011 в 21:21. |
|
|||||
|
Modus ponens
|
По ссылке - там и мухи и повидло и чего только нет
И транзакцию туда же приплели... Т.е. у понятия "транзакция" есть вполне опредленный смысл, который где-то отдаленно напоминает команду... но, так, на уровне "Мойша по телефону напел". Транзакция - это набор действий, в пределах которых гарантируется постоянство результата использованых выражений. Это восновном применимо к базам данных. Т.е. например,
в пределах одной транзакции должно всегда вернуть один и тот же результат, не зависимо от того, сколько раз вы его вызвали. У понятия "команда" тоже есть определение, и оно вон выше перед вами. Там явно сказано о том, что должно быть. Ничего не сказано о возвращаемом типе, следовательно, возможен любой. Ничего не сказано об обращении к свойствам каких-то классов, следовательно они не нужны.
__________________
Hell is the possibility of sanity |
|
|||||
|
"Команда - паттерн поведения объектов. Инкапсулирует запрос как объект, позволяя тем самым задавать параметры клиентов для обработки соответствующих запросов, ставить запросы в очередь или протоколировать их, а также поддерживать отмену операций. Известен также под именем Action (действие), Transaction (транзакция)."(с)GoF
Вообще почитайте тогда это, если то что было выше вам не нравится http://pure-mvc.org/doku.php/patterns/behaviour/command Типа истинна в последней инстанции, потому как собственно авторами написана ![]() P.S. Хотя после фразы Цитата:
P.P.S. Почему команда не должна возвращать результат я написал. Но опять же это не правило, это то, как на мой взгляд должно это выгладить... А каждый все равно волен делать как ему хочется... Но если наша команда можт ставиться в очередь, о чем сказано в определении, возвращаемый результат не имеет смысла...
__________________
Искренне Ваш, Джек. Последний раз редактировалось JackFromChaos; 21.01.2011 в 22:31. |
|
|||||
|
Регистрация: Mar 2007
Сообщений: 545
|
|
![]() |
![]() |
Часовой пояс GMT +4, время: 12:54. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| AS3 , OOP , pattern |
|
|