Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.01.2011, 18:35
cyber_maniac вне форума Посмотреть профиль Отправить личное сообщение для cyber_maniac Найти все сообщения от cyber_maniac
  № 1  
Ответить с цитированием
cyber_maniac

Регистрация: Jan 2011
Сообщений: 2
По умолчанию Шаблон программирования - Команда

В книге "ActionScript 3 Design Patterns" увидел пример использования этого шаблона - вызов сообщения по таймеру.
На его основе я попробовал сделать своё - вывод сообщения по щелчку мыши. В дальнейшем хочу сделать таким способом перетаскивание объектов на экране.
Но ничего не получается, флэш при компилировании выдаёт ошибку "TestInterfaceOne.as, Line 38 1136: Incorrect number of arguments. Expected 1.".

Вот сам код:

IDrag.as
Код AS3:
package {
 
    public interface IDrag {
 
	 function execute():void;
 
    }
 
}

DragCommand.as
Код AS3:
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
Код AS3:
package {
 
    import flash.events.*;
    import flash.display.*;
 
    public class DragReceiver extends Sprite {
 
        function action() {
 
	        trace("hit!");
 
        }
    }
}

DragInvoker.as
Код AS3:
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
Код AS3:
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();
 
       }		
    }
}
В общем, хочу как следует освоить этот паттерн.

Старый 21.01.2011, 19:12
GemiBillyBob вне форума Посмотреть профиль Отправить личное сообщение для GemiBillyBob Найти все сообщения от GemiBillyBob
  № 2  
Ответить с цитированием
GemiBillyBob

Регистрация: Aug 2010
Адрес: Харьков, Украина
Сообщений: 42
Думаю, 38-я строка не помешала бы.
Код AS3:
Line 38 1136: Incorrect number of arguments. Expected 1.
Мне, например, ещё неясно, что такое "invoker.setTriger();", где такое есть?

Старый 21.01.2011, 20:17
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
На сколько я это себе предствляю, этот шаблон происходит от ограниченности Java, в котором исполняемый код нельзя передать по ссылке. В AS3 в нем необходимости я никогда не замечал.
Т.е. если мы назовем Function - Command, а apply / call заменим на run / execute получим то же самое, только уже встроенное в плеер.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 21.01.2011 в 20:20.
Старый 21.01.2011, 20:36
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 4  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
@wvxvw, я правильно понимаю что ты рекомендуешь не использовать GoF Command, а просто дёргать нужный метод по ссылке?

Старый 21.01.2011, 20:49
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 5  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
2wvxvw: Команду можно параметризировать, а указатель на функцию - нет.
Кроме того, все таки этот паттерн, это не только Callback... А нечто большее...
Хотя, конечно, в некоторых случаях, можно обойтись и функцией.
__________________
Искренне Ваш, Джек.

Старый 21.01.2011, 20:55
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну, как я понимаю из объяснения вики:
Цитата:
Сообщение от http://en.wikipedia.org/wiki/Command_pattern
In object-oriented programming, the command pattern is a design pattern in which an object is used to represent and encapsulate all the information needed to call a method at a later time. This information includes the method name, the object that owns the method and values for the method parameters.
То, не совсем так, но близко. Т.е. в AS3 в общем случае реализация бы выглядела так:
Код AS3:
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 нет, и если мы наследуемся или имплементим чего-то мы не можем поменять возвращаемый тип на более точный (вот тут уже ограниченность AS3). Поэтому я им и не пользуюсь наверное
Да, и судя по описанию, этот шаблон в общем случае в AS3 реализовать не возможно т.как у функции может не быть имени
__________________
Hell is the possibility of sanity

Старый 21.01.2011, 21:19
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 7  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Это всего лишь один из примеров реализации...
Вот тут много ссылочек и примеров на тему http://seregaborzov.wordpress.com/20...mmand-pattern/
И коль скоро есть команды, зачастую их реализация несколько сложнее, чем указатель на функцию и массив ее параметров...

P.S.
Как один из примеров. У нас есть некоторая рпг-ка... Там есть всякие заклинания и прочяя ерундень...
Любое заклинание содержит в себе команду, которая проделывает реальное действие.
А сами команды вообще описываются в XML например или JSON или еще как то... Ну например так:
Код AS3:
{name:"FireBall",type:"DealDamage",damage:100}
Т.е. FireBall - id описанной команды
DealDamage - класс команды, написанный на AS
damage - одно из свойств класса DealDamage...

И как такое реализовать с помощью фунцкии?

А возвращать команда ничего не должна... Ну или boolean, максимум... Хотя это тоже лишнее, потому что команда может выполняться отложено, но пользователь об этом знать не должен...
__________________
Искренне Ваш, Джек.


Последний раз редактировалось JackFromChaos; 21.01.2011 в 21:21.
Старый 21.01.2011, 22:06
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
По ссылке - там и мухи и повидло и чего только нет И транзакцию туда же приплели... Т.е. у понятия "транзакция" есть вполне опредленный смысл, который где-то отдаленно напоминает команду... но, так, на уровне "Мойша по телефону напел". Транзакция - это набор действий, в пределах которых гарантируется постоянство результата использованых выражений. Это восновном применимо к базам данных. Т.е. например,
Код:
select "foo" from T
в пределах одной транзакции должно всегда вернуть один и тот же результат, не зависимо от того, сколько раз вы его вызвали. У понятия "команда" тоже есть определение, и оно вон выше перед вами. Там явно сказано о том, что должно быть. Ничего не сказано о возвращаемом типе, следовательно, возможен любой. Ничего не сказано об обращении к свойствам каких-то классов, следовательно они не нужны.
__________________
Hell is the possibility of sanity

Старый 21.01.2011, 22:27
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 9  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
"Команда - паттерн поведения объектов. Инкапсулирует запрос как объект, позволяя тем самым задавать параметры клиентов для обработки соответствующих запросов, ставить запросы в очередь или протоколировать их, а также поддерживать отмену операций. Известен также под именем Action (действие), Transaction (транзакция)."(с)GoF
Вообще почитайте тогда это, если то что было выше вам не нравится http://pure-mvc.org/doku.php/patterns/behaviour/command
Типа истинна в последней инстанции, потому как собственно авторами написана
P.S. Хотя после фразы
Цитата:
Сообщение от wvxvw Посмотреть сообщение
Там явно сказано о том, что должно быть. Ничего не сказано о возвращаемом типе, следовательно, возможен любой. Ничего не сказано об обращении к свойствам каких-то классов, следовательно они не нужны.
спорить совсем не хочется... Вы ведь понимаете, что паттерны - это не библиотека классов и правил программирования?
P.P.S. Почему команда не должна возвращать результат я написал. Но опять же это не правило, это то, как на мой взгляд должно это выгладить... А каждый все равно волен делать как ему хочется... Но если наша команда можт ставиться в очередь, о чем сказано в определении, возвращаемый результат не имеет смысла...
__________________
Искренне Ваш, Джек.


Последний раз редактировалось JackFromChaos; 21.01.2011 в 22:31.
Создать новую тему Ответ Часовой пояс GMT +4, время: 12:54.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
AS3 , OOP , pattern

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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