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

vvvvvvf 03.07.2009 02:58

Какой стиль объявления событий используете вы?
 
Доброго времени суток.
Я тут поглядел исходники(as3) различных проектов и обнаружил различные стили объявления событий.

Выделю основные три стиля объявления:

Первый самый короткий, объявлять функции прямо в листенере:
Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite {
                public function Main():void {
                        addEventListener(MouseEvent.CLICK, function(e:*) {
                                trace('click');
                        });
                }
        }
}

второй объявлять функцию внутри метода класса:
Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite {
                public function Main():void {
                        addEventListener(MouseEvent.CLICK, myClick);
                        function myClick(e:*):void {
                                trace('click');
                        }
                }
 
        }
}

и третий объявлять функцию как отдельный метод класса:
Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite {
                public function Main():void {
                        addEventListener(MouseEvent.CLICK, myClick);
                }
                public function myClick(e:*):void {
                        trace('click');
                }
        }
}

а какой способ используете вы и какой на ваш взгляд является самым верным?

Molecula 03.07.2009 03:06

Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite {
                public function Main():void {
                        super();
                        super.addEventListener(MouseEvent.CLICK, this.myClick);
                }
                public function myClick(e:MouseEvent):void {
                        trace('click');
                }
        }
}


etc 03.07.2009 07:42

Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite {
 
                public function Main() {
                        super();
                        super.addEventListener(MouseEvent.CLICK, this.handler_click);
                }
 
                /**
                * @private
                */

                private function handler_click(event:MouseEvent):void {
                        trace('click');
                }
        }
}


twix1124 03.07.2009 08:57

Код AS3:

package {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite {
                public function Main():void {
                        super();
                        super.addEventListener(MouseEvent.CLICK, this.myClick);
                }
                public function myClick(e:MouseEvent):void {
                        trace('click');
                }
        }
}


Smirnov48 03.07.2009 10:07

А зачем addEventListener у super? Ведь если его просто пишешь - тоже катит.

MonkDead 03.07.2009 10:08

Код AS3:

package 
{
 
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class Main extends Sprite
        {
 
                public function Main()
                {
                        super();
                        super.addEventListener(MouseEvent.CLICK, this.onClick);
                }
 
                private function onClick(event:MouseEvent = null):void
                {
                        trace("click");
                }
        }
}

Странно что все кроме __etc, пишут что конструктор что-то возвращает :).
Код AS3:

public function Main():void

Вообще то он ничего не возвращает!

etc 03.07.2009 10:12

Цитата:

Сообщение от Smirnov48 (Сообщение 832880)
А зачем addEventListener у super? Ведь если его просто пишешь - тоже катит.

Можете не писать.

Smirnov48 03.07.2009 10:19

Спасибо. :) Вот меня и на сторожило - то что я обычно не пиши. Не super() не this. Вот и хотелось бы узнать - зачем? Или покрайней мере логику почему вы так пишете. Вдруг если их не писать баги полезут.

etc 03.07.2009 10:24

Дабы не повторяться:
http://www.flasher.ru/forum/showthread.php?t=126668
(начиная с какого-то там поста)

DeliMIter 03.07.2009 11:43

Цитата:

Сообщение от Smirnov48 (Сообщение 832885)
Вдруг если их не писать баги полезут.

Вызов метода через super однозначно указывает, что следует вызывать метод в суперклассе, даже если этот метод переопределён в текущем классе.

Обращение к полю или методу через this однозначно указывает на использование полей текущего объекта, ибо без указания контекста в доступных областях видимости могут оказаться переменные с такими же именами, например:

Код AS3:

class XXX extends MovieClip
{
        public finction moveTo(x:Number, y:Number):void
        {
                this.x = x;
                this.y = y;
        }
}

Иногда явное указание контекстов this и super является превентивным стилем написания кода, который позволяет избежать случайного возникновения проблем, вытекающих как из упомянутых выше, так и не упомянутых вовсе, особенностей AS3.

SatAnton 10.07.2009 23:02

Тело пишу под FrameRate, предварительно насовав кучу
boolean или int - функций среди var-ов.
Само собой иногда приходится делать removeListener.

Zik. 11.07.2009 09:32

я пишу третим способом

Gaen 12.07.2009 17:37

В первых двух случаях будет очень проблематично сделать removeEventListener. Выбор в пользу третьего варианта очевиден.

GydruS 12.07.2009 20:36

Цитата:

Сообщение от MonkDead (Сообщение 832881)
Странно что все кроме __etc, пишут что конструктор что-то возвращает :).
Код AS3:

public function Main():void

Вообще то он ничего не возвращает!

void - это и значит, что ничего.
В языке си это обязательный параметр синтаксиса.
ActionScript же куда более "лоялен" и подобное прощает.

AL.exe 12.07.2009 21:14

Я чаще делаю функции-хендлеры не private, а protected. Правда, в зависимости от случая.

Стиль названия - clickHandler или someObjectClickHandler (если не к this).

Третий способ.

udaaff 12.07.2009 21:14

Цитата:

void - это и значит, что ничего.
В языке си это обязательный параметр синтаксиса.
ActionScript же куда более "лоялен" и подобное прощает.
Конструктор не может возвращать никаких значений, даже если захочет, поэтому явно показывать это не нужно. Методы же, напротив, могут возвращать значение, а могут не возвращать, поэтому нужно явно указывать это, чтобы было понятно, что разработчик не забыл его там написать. Также отсутствие void у конструктора помогает отличить его от метода.

vvvvvvf 13.07.2009 05:31

Код AS3:

                var mySp:Sprite = new Sprite();                        
                mySp.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
                        trace('enter frame');
                });

У меня сложилось такое впечатление, что подобный код будет сильно засорять память.
Я где-то прочитал, что если вызывать подобную конструкцию, то при каждом запуске события функция и все её содержимое создается заново, а предыдущая её версия не удаляется.

Правда ли это?

GydruS 13.07.2009 05:58

Цитата:

Сообщение от udaaff (Сообщение 834938)
Конструктор не может возвращать никаких значений, даже если захочет, поэтому явно показывать это не нужно. Методы же, напротив, могут возвращать значение, а могут не возвращать, поэтому нужно явно указывать это, чтобы было понятно, что разработчик не забыл его там написать. Также отсутствие void у конструктора помогает отличить его от метода.

У методов, если они не возвращают ничего, можно и не писать :void - интерпретатор это поймет по наличию/отсутствию ключевого слова return.
А имя конструктора в си-подобных синтаксисах всегда такое же, как и имя класса - и только этого с лихвой хватает, чтобы не спутать конструктор ни с чем другим (к тому же можно смотреть так: ф-я, начинающаяся в большой буквы и есть конструктор). Ведь нельзя читать-воспринимать код класса вне его контекста.
З.Ы. А в Delphi, например, конструктор определяется словам constructor.

Цитата:

Сообщение от vvvvvvf (Сообщение 835025)
Код AS3:

                var mySp:Sprite = new Sprite();                        
                mySp.addEventListener(Event.ENTER_FRAME, function(e:Event):void {
                        trace('enter frame');
                });

У меня сложилось такое впечатление, что подобный код будет сильно засорять память.
Я где-то прочитал, что если вызывать подобную конструкцию, то при каждом запуске события функция и все её содержимое создается заново, а предыдущая её версия не удаляется.

Правда ли это?

Правда. Но если это всегда держать в голове - то это нормально. Т.е. если вы вешаете на одно событие один обработчик и не планируете его удалять в процессие исполнения кода - то можете так делать. Ничего страшного, если такое не далается в цикле и т.п.
Детальнее: сам код/значение вычищается из памяти, когда на на него никто больше не ссылается. Грубо говоря, в данном примере на него ссылается EventListener. Когда он перестанет ссылаться, код удалится из памяти. Но чтобы он перестал ссылаться - нужно сделать removeEventListener. В этом примере вам это не удастся. Нужно иметь ссылки на ф-ю, которуй вы удаляете из EventListener. А ссылка эта в примере не сохраняется ни в какую переменную - она генерируется "на лету" и сразу в стек параметров. Поэтому вы не сможете ее узнать.
Вот иной вариант:
Код AS3:

var mySp:Sprite = new Sprite();
var f:Function = f(){trace('yo!'); mySp.removeEventListener(Event.ENTER_FRAME, f)};
mySp.addEventListener(Event.ENTER_FRAME, f);

Но!!! Не используйте бездумно подобный код! Ибо за пределами видимости переменных mySp и f не будет! Учитывайте это!

BlooDHounD 13.07.2009 08:53

что-то тема анонимных функция часто плавает последних 2 недели...
http://www.flasher.ru/forum/showpost...77&postcount=7
http://www.flasher.ru/forum/showpost...4&postcount=19

crazyone 13.07.2009 14:07

У меня вопрос.
Просто к слову, почти оффтоп:

Код AS3:

function oneTimeHandler(e:Event){
    //bla-bla
    var useCapture=(e.eventPhase==EventPhase.CAPTURING_PHASE)?true:false;
    e.target.removeEventListener(e.type,arguments.callee,useCapture);
}

Это же всегда сработает, правда? Ну, вызвется один раз и перестанет слушать сразу, как бы этот обработчик не подписывали на какое угодно событие.
А то у меня чувство, что я не до конца разобрался с т.н. Event flow'ом...

BlooDHounD 13.07.2009 14:20

Код AS3:

var useCapture:Boolean = (e.eventPhase==EventPhase.CAPTURING_PHASE).toString().length==5 ? false : true;
//

так круче.

dimarik 13.07.2009 14:34

А я такой еще пример подглядел в Flex 3 coockbook
Код AS3:

var flag:Boolean = true;
flag = flag == true ? false : true;


crazyone 13.07.2009 14:53

Простите, не спал сегодня =)
Ну, а вобще, там никаких ньюансов нет, типа как-нибудь, что-нибудь, куда-нибудь добавилось и слушатель не удалится/удалится не оттуда/etc.?

dimarik 13.07.2009 15:12

Цитата:

Сообщение от crazyone (Сообщение 835095)
Простите, не спал сегодня =)
Ну, а вобще, там никаких ньюансов нет, типа как-нибудь, что-нибудь, куда-нибудь добавилось и слушатель не удалится/удалится не оттуда/etc.?

Нюансов вроде нет. Только e.target имеет тип Object. А так - всё.

crazyone 13.07.2009 15:16

А там случайно не надо currentTarget использовать?

dimarik 13.07.2009 15:34

Да, проглядел.


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

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