Форум 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/

alatar 21.01.2011 22:42

Цитата:

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

wvxvw 21.01.2011 23:21

Не, тут фишка в другом. Практика показывает (например Cairngorm), что применение этого паттерна к AS3 заканчивается чуть чаще чем всегда плохо. И если Cairngorm можно приравнять к ограблению с нанесением, то PureMVC, в таком случае, - это расстрельная статья. А еще лучше, казнить через повешение на каком-нибудь видном месте, чтобы остальным в назидание :)
Давайте я по такому поводу на другом жизненном примере покажу: вот, существует такая вещь как "кашрут" - на самом деле, набор правил поведения в иудаизме, но больше извесная как несуразные правила питания. Одно из самых глупых правил - разделение мясной и молочной пищи. Оправданием существования этому правилу служит библейская строчка "не вари ягненка в молоке матери". Т.е. никто никогда не говорл, например про сыр или курятину. Но, даже не это главное. История же этого "закона" такова: в древности в селах было принято летом собирать всю сельскую живность в стадо, и посылать его пастись далеко от населенных пунктов. Вместе со стадом, естесственно, полагались и пастухи. Пастухи были как правило самыми бедными поселянами, и для них это событие было поводом подзаработать. Так вот, закон был написан для пастухов-сменщиков, чтобы, сволочи, не воровали ягнят, которые рождаются пока скотина далеко от дома!
Использование шаблонов в програмировании мне очень часто напоминает эту историю... т.е. я вот сейчас сижу и в унынии гляжу на 100500 датаконтроллеров в нашем проекте и понимаю, что если бы человек никогда не читал про шаблоны, мне бы сейчас было меньше переделывать... Вообще, упоминание шаблонов всуе скорее вызывает рвотный рефлекс, сравнимый по ощущению с рассматриванием килотон Ява-энтерпрайз кода, бессмысленного и беспощадного.

Котяра 21.01.2011 23:44

Олег - ты приближаешься к "гуру" в моём любимом табеле о рангах программистов)

JackFromChaos 22.01.2011 00:09

А я специально никогда не использую паттерны... Но, к примеру впервые когда я взял в руки книгу про паттерны и почитал, понял что использую минимум четверть паттернов... Хотя иногда к ним обращаюсь, потому как они становятся чем то вроде терминологии проектирования....
А еще мне не понятно, почему все так усиленно привязывают паттерны к яве... В той же книге от GoF, все примеры сделаны на С++...
P.S. Посднюю ссылку которую я давал не имеет отношение к PureMVC. Просто первая ссылка которую дал гугл на непосредственно оригинальный книги GoF.
P.P.S. Никто никого не заставляет пользоваться шаблонами... С другой стороны думаю куда чаще встречается код, где программисты пишут без какого либо понятия о паттернах, да и ООП... И разобраться и исправить мегабайты когода будет ничуть не проще...
P.P.P.S. При этом, я согласен, что есть тендеция перебарщивать с паттернами и MVC и объектно ориентированного выпендрежа, что тоже есть плохо... Но тут главное не забывать, что программа пишется для того что бы работать, а не быть красивой внутри... Но и не забывать, что потом ее может быть придется дорабатывать:)3

wvxvw 22.01.2011 00:39

Потому что умножающий знания умножает беды. :)
И вообще, мы во флейм скатываемся. А чтобы этого не случилось... обретем вновь серьезную личину :)
На самом деле простота, если уж мы заговорили об энтерпрайз секторе гораздо важнее соответствия каким угодно шаблонам (что не говорит о том, что соответствие шаблонам обязательно ведет к сложности). Простой код легче, и в итоге экономически выгоднее сопровождать, кроме того, меньше шансов, что он будет неисправно работать. Поэтому когда я вижу блок-схему из 8 классов, там где это без ущерба для здоровья заменяется одним, мне становится плохо :)
И я не сторонник динамической типизации :P

Шаблоны привязывают к Яве потому, что в C++ - разброд и шатания, каждый определяет строки и булианы как ему нравится, а то и числа могут переназначить. А в Яве все единообразно до занудства. Т.е. в задачах, где типично используется Ява, как правило креатив не то что не приветствуется, за него и с работы вылететь можно. Поэтому шаблонное мышление == Ява мышление, а с другой стороны Ява - язык для людей с отставанием в развитии (это не я, это извесная цитата).

JackFromChaos 22.01.2011 01:03

Ок, завязываем с холиваром. Единственное, если кто-то хочет освоить паттерны, не стоит его от этого отговаривать... А то ведь может статься так, придет человек на работу устраиваться, его чего нить спросят, а он не знает. И будет на вашей совести, что его на работу не взяли, а оно вам надо, карму портить? ;)

cyber_maniac 24.01.2011 11:58

Код AS3:

invoker.setTriger();

GemiBillyBob, это и есть 38 строка, просто я это не написал - мой косяк. =( Эта строка ссылается на функцию, которая определяет приёмник события (клик мышки).

Вот мне как раз нужно освоить паттерны. Лучше сразу учиться правильно, чем потом ломать сформировавшиеся привычки и переучиваться когда возникнет реальная необходимость. И простой пример вывода сообщения и взял не из-за того, что я не знаю как сделать проще, а для простоты понимания и освоения шаблонов, ООП вообще.

JackFromChaos правильно заметил. Для тех же игр со множеством разных персонажей шаблоны как раз очень хорошо подходят, или для меню сайта/программы и т.д.

P.S. Я не знаю ни java, ни C++.


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

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