Форум 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=140798)

mikhailk 09.06.2010 19:18

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

Продал твой фермер корову вместе с попоной на колбасу, сервер вернул информацию о том, что сделка акцептована, ты сформировал хорошее такое событие с xml-кой внутри, прогнал его не задумываясь по всем объектам (касса, хлев, склад, производственный план, что там еще), и все счастливы. Каждый объект взял из него то, что его касается, и все аккуратненько и синхронно обновилось.

Но, это лично мне так нравится.
Совсем не обязательно, что так правильно.

Psycho Tiger 09.06.2010 20:11

mikhailk, у нас речь не о обмене сервер-клиент, а о событиях в самой флешке. Наследники flash.events.Event так сказать)

Mur4ik 09.06.2010 22:36

Если все события генерирует один объект, то можно предположить, что все параметры передаваемые через события как то связаны или имеют принадлежность к какой то сущности. Можно сделать и один класс события в котором будет один параметр представляющий собой класс, который содержит в себе нужные строго типизированные свойства (т.н. value object). Т.е решение подобное ому как делает Psycho Tiger, только не в ущерб типизации, автокомплита и т.д.

koIIImarik 09.06.2010 22:44

2 Mur4ik:
Как мне кажется, ваш вариант подходит в том случае, если этот объект с типизированными переменными будет использоваться ещё где-нибудь (допустим его будут передавать в качестве параметра для создания объектов на основе этого объекта), иначе, как мне кажется, нет смысла переносить список переменных из Event объекта в какой-то другой объект, потому что по сути добавляется только 1 промежуточный этап на пути доступа к переменным.

Mur4ik 09.06.2010 22:58

Не спорю.
Просто если параметры передаваемые событием связаны, то мне удобнее видеть их в одном объекте, который их характеризует, вместо того чтоб в классе события создавать 5-10 параметров, с которыми работа только усложняется, особенно в случае когда нужно передать большую часть из этих параметров (имеется ввиду инициализация события). А вот имея один-два типизированных объекта все становится прозрачнее и удобнее, ИМХО.

switcher! 10.06.2010 13:50

Цитата:

Сообщение от etc (Сообщение 914122)
Досточно public-ов. От геттеров проку нет, событие всё равно клонируется постоянно.

Цитата:

Сообщение от fljot (Сообщение 914234)
Клонируется то клонируется, но это при бабблинге или в разных обработчиках...

что-то я, видимо, не понимаю. Не замечал, чтобы событие при баблинге клонировалось. По крайней мере, в дисплейобджектах.
Если все правильно про клонирование, то как/когда это происходит при нативном всплытии события? :o

Вот пример того, что наблюдаю я:
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Example extends Sprite
        {
                private var _event:MyEvent;
 
                function Example() {
                        super();
 
                        var s1:Sprite = new Sprite();
                        var s2:Sprite = new Sprite();
                        var s3:Sprite = new Sprite();
 
                        super.addChild(s1);
                        s1.addChild(s2);
                        s2.addChild(s3);
 
                        s1.addEventListener(Event.CHANGE, this._test1);
                        s2.addEventListener(Event.CHANGE, this._test2);
 
                        s3.dispatchEvent(new MyEvent(Event.CHANGE, true));
                }
 
                private function _test1(e:MyEvent):void {
                        trace(e.info); //10
                        trace(this._event === e); //true
                }
 
                private function _test2(e:MyEvent):void {
                        trace(e.info); //5
                        e.info = 10;
                        this._event = e;
                }
        }
}

Код AS3:

package  
{
        import flash.events.Event;
 
        public class MyEvent extends Event
        {
                public var info:int;
 
                function MyEvent(type:String, bubbles:Boolean = false, info:int = 5, cancelable:Boolean = false) {
                        super(type, bubbles, cancelable);
 
                        this.info = info;
                }
 
                // монжно раскомментить - трейсы те же.
                /*override public function clone():Event {
                        return new MyEvent(super.type, super.bubbles, 20)
                }*/

        }
}


Psycho Tiger 10.06.2010 15:40

Попробуйте сделать
Код AS3:

super.addEventListener(YourEvent.EVENT, super.dispatchEvent);


switcher! 10.06.2010 17:31

да, при редиспатче поюзанного эвента - он клонируется. Видимо, идет проверка а-ля:
Код AS3:

if (event.$target) //внутренний internal таргет
{
        event = event.clone();
}

Благо EventDispatcher и Event лежат в одном пакете. Однако, это домыслы, ибо неизвестно, что в тамошних сях записано.

Но не суть. Из контекста приведенных мною цитат ниразу не понятно, что идет редиспатч. Скорей наоборот - речь об обычном распространении события. А при нем, как показывают тесты, клонирования события от обработчика к обработчику не происходит.
Собственно, по этому поводу я и ожидал комментариев.

fljot 10.06.2010 17:34

Хм да, я тоже несколько удивлён=) etc, не разъяснишь?

Psycho Tiger 10.06.2010 17:57

Событие клонируется при нативном EventDispatcher::dispatchEvent`е.


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

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