Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Шаблон программирования - Команда (http://www.flasher.ru/forum/showthread.php?t=149263)

cyber_maniac 21.01.2011 18:35

Шаблон программирования - Команда
 
В книге "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();
 
      }               
    }
}

В общем, хочу как следует освоить этот паттерн.

GemiBillyBob 21.01.2011 19:12

Думаю, 38-я строка не помешала бы.
Код AS3:

Line 38 1136: Incorrect number of arguments. Expected 1.

Мне, например, ещё неясно, что такое "invoker.setTriger();", где такое есть?

wvxvw 21.01.2011 20:17

На сколько я это себе предствляю, этот шаблон происходит от ограниченности Java, в котором исполняемый код нельзя передать по ссылке. В AS3 в нем необходимости я никогда не замечал.
Т.е. если мы назовем Function - Command, а apply / call заменим на run / execute получим то же самое, только уже встроенное в плеер.

Psycho Tiger 21.01.2011 20:36

@wvxvw, я правильно понимаю что ты рекомендуешь не использовать GoF Command, а просто дёргать нужный метод по ссылке?

JackFromChaos 21.01.2011 20:49

2wvxvw: Команду можно параметризировать, а указатель на функцию - нет.
Кроме того, все таки этот паттерн, это не только Callback... А нечто большее...
Хотя, конечно, в некоторых случаях, можно обойтись и функцией.

wvxvw 21.01.2011 20:55

Ну, как я понимаю из объяснения вики:
Цитата:

Сообщение от 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 реализовать не возможно т.как у функции может не быть имени :)

JackFromChaos 21.01.2011 21:19

Это всего лишь один из примеров реализации...
Вот тут много ссылочек и примеров на тему 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, максимум... Хотя это тоже лишнее, потому что команда может выполняться отложено, но пользователь об этом знать не должен...

wvxvw 21.01.2011 22:06

По ссылке - там и мухи и повидло и чего только нет :) И транзакцию туда же приплели... Т.е. у понятия "транзакция" есть вполне опредленный смысл, который где-то отдаленно напоминает команду... но, так, на уровне "Мойша по телефону напел". Транзакция - это набор действий, в пределах которых гарантируется постоянство результата использованых выражений. Это восновном применимо к базам данных. Т.е. например,
Код:

select "foo" from T
в пределах одной транзакции должно всегда вернуть один и тот же результат, не зависимо от того, сколько раз вы его вызвали. У понятия "команда" тоже есть определение, и оно вон выше перед вами. Там явно сказано о том, что должно быть. Ничего не сказано о возвращаемом типе, следовательно, возможен любой. Ничего не сказано об обращении к свойствам каких-то классов, следовательно они не нужны.

JackFromChaos 21.01.2011 22:27

"Команда - паттерн поведения объектов. Инкапсулирует запрос как объект, позволяя тем самым задавать параметры клиентов для обработки соответствующих запросов, ставить запросы в очередь или протоколировать их, а также поддерживать отмену операций. Известен также под именем Action (действие), Transaction (транзакция)."(с)GoF
Вообще почитайте тогда это, если то что было выше вам не нравится http://pure-mvc.org/doku.php/patterns/behaviour/command
Типа истинна в последней инстанции, потому как собственно авторами написана:)
P.S. Хотя после фразы
Цитата:

Сообщение от wvxvw (Сообщение 966713)
Там явно сказано о том, что должно быть. Ничего не сказано о возвращаемом типе, следовательно, возможен любой. Ничего не сказано об обращении к свойствам каких-то классов, следовательно они не нужны.

спорить совсем не хочется... Вы ведь понимаете, что паттерны - это не библиотека классов и правил программирования?
P.P.S. Почему команда не должна возвращать результат я написал. Но опять же это не правило, это то, как на мой взгляд должно это выгладить... А каждый все равно волен делать как ему хочется... Но если наша команда можт ставиться в очередь, о чем сказано в определении, возвращаемый результат не имеет смысла...

andrew911 21.01.2011 22:39

http://johnlindquist.com/2010/09/09/...mmand-pattern/


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

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