Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Состоятельность конструкции if (stage) initialize(); (http://www.flasher.ru/forum/showthread.php?t=162789)

goodguy 04.08.2011 09:45

Состоятельность конструкции if (stage) initialize();
 
Почти всегда использую конструкцию:
Код AS3:

if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
 
private function init(e:Event = null):void {
 
}

Да, собственно и флешдевелоп ее создает по умолчанию для АС3 проектов.
И вот задался вопросом, а в чем вообще смысл верхней строки в данном случае?
Ведь очевидно же, что сразу после создания экземпляря stage всегда = null.
Или все-таки бывают те редкие случаи, когда "if" блок может сработать?

-De- 04.08.2011 09:53

Если флэшка не подгружена в другую - сработает.

dimarik 04.08.2011 09:57

Если флешка загружается, то у нее не будет stage, даже если лоадер добавлен в него. Если флешка stage owner (самая первая исполняемая FP), stage будет присутствовать, но все равно для нее будет диспатчиться ADDED_TO_STAGE. Я отказался от условия и использую только одну строку.

Код AS3:

addEventListener(Event.ADDED_TO_STAGE, init);


goodguy 04.08.2011 10:12

Цитата:

Если флешка stage owner (самая первая исполняемая FP)
Точно. Только сейчас заметил

Цитата:

Если флэшка не подгружена в другую - сработает.
Не сработает, я проверял. Сработает событие. Или имеется в виду то же, о чем сказал dimarik?

Aquahawk 04.08.2011 16:06

На самом деле, даже если stage есть у документ класса когда он стартует отдельно, событие addedToStage будет задиспатчено чуть позже. Т.е. по идее можно писать только addEventListener, но не стоит так делать ибо идеологически это косяк. Вообще присутствие стейджа в конструкторе док класса - бага эдоб, его там быть не должно. Но видимо они посчитали что для новичков так будет проще. Чем добавили несказанное количество геморроя желающим подгрузить внутрь себя отображаемые флешки динамически.

dimarik 04.08.2011 16:50

Aquahawk, я ничего не понял.

С одной стороны говорите, что наличие stage в конструкторе -- это баг. С другой, что инициализация по addedToStage -- это идеологический косяк. Как же нам сделать правильно?

Aquahawk 04.08.2011 17:14

В том смысле что писать просто
Код AS3:

addEventListener(Event.ADDED_TO_STAGE, init);

без проверки на существование стейджа можно и это будет работать, даже несмотря на то что, в связи с багом(фичей если удобнее), стейдж есть в конструкторе док класса. Но так делать не надо, всегда надо писать констрккцию с ифом.

dimarik 04.08.2011 17:29

Цитата:

Но так делать не надо, всегда надо писать констрккцию с ифом.
Почему так делать не надо?

Я сделал прямо противоположный вывод по двум причинам.
1) Если наличие stage в конструкторе -- это баг, значит его могут поправить и if точно не нужен.
2) Каждый DO генерирует событие ADDED_TO_STAGE, значит if не нужен.

goodguy 04.08.2011 17:32

Цитата:

Но так делать не надо, всегда надо писать констрккцию с ифом.
А по-моему не стоит так писать, это захламляет код. Раз работает просто addedToStage, то для меня лично этот вариант предпочтительнее. Тут я полностью соглавен с Димариком.
Идеологии бывают разные. Кто-то считает что надо использовать this, кто-то выравнивает все типы переменных табуляцией и т.п. Это не говорит о том, что какой-то вариант правильный, а какой-то нет.

Aquahawk 04.08.2011 17:57

Эдоб решила что даст ссылку на stage для документ класса в конструкторе. На самом деле stage доступен в конструкторе ещё у объектов которые положены в ide кадр и им присвоен класс, у них тоже stage есть в конструкторе, тем не менее событие addedtostage отправляется уже после того как stage доступен. Более того если такую флешку динамически подгрузить то в ней stage не будет в конструкторах объектов лежащих на первом кадре и у документ класса. Всё это смахивает на костыльность. Просто при создании самой средой(объекты на кадрах и док класс) происходит немного магии, а именно дисплейобджект конструируется раньше чем ваш конструктор, потом этот дисплейобджект добавляется на сцену, и только потом уже запускается ваш конструктор. Это можно пронаблюдать если сделать в ide дисплейобджект а в конструкторе написать такой код
Код AS3:

if (2+2!=4){super();}

и вы увидите что конструктор предка не вызовется(можно проверить цепочкой двойным наследованием) а дисплейобджект будет вполне функционален.


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

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