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

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'ом...


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

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