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

SmartFox 22.11.2012 17:18

Конструктор главного класса приложения
 
Всем доброго времени суток!

Я заметил, что во многих туториалах по AS3 избегают проводить всю необходимую инициализацию
в конструкторе главного класса приложения. Вместо этого создают отдельную функцию и вызывают
ее по наступлению события ADDED_TO_STAGE. Почему?

Flash Develop вообще по-умолчанию генерирует такой код:
Код AS3:

if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);

Т.е., как я понимаю, объект stage может еще не существовать к моменту создания объекта нашего класса?
Я всегда всю инициализации проводил в конструкторе и проблем не было...

КорДум 22.11.2012 17:23

Цитата:

Т.е., как я понимаю, объект stage может еще не существовать к моменту создания объекта нашего класса?
Когда флешка загружается в другую, stage у нее не доступен сразу.

Цитата:

Я всегда всю инициализации проводил в конструкторе
Код в конструкторе интерпретируется FP каждый раз, когда его вызов встречается в коде, вместо того, чтобы кэшировать в памяти все интерпретированное, что происходит с методами, например. Поэтому тратится больше времени на вызов конструктора.

SmartFox 22.11.2012 17:32

Цитата:

Сообщение от КорДум (Сообщение 1105636)
Когда флешка загружается в другую, stage у нее не доступен сразу.

Мм... т.е. если я не использую обращение к stage в коде инициализации или если я не планирую
загружать данную флешку внутрь другой, то можно всю инициализацию в конструктор пихать?

Цитата:

Сообщение от КорДум (Сообщение 1105636)
Код в конструкторе интерпретируется FP каждый раз, когда его вызов встречается в коде, вместо того, чтобы кэшировать в памяти все интерпретированное

Но встречается-то он всего один раз! Это же основной класс и создается всего один его объект.

Zebestov 22.11.2012 17:36

Если ты не планируешь проверять наличие stage в конструкторе с последующим алертом типа "ай-ай-ай!!!", то можно опустить этот блок и производить инициализацию прямо в конструкторе. Главное не отвыкнуть от хорошего и не делать так в других классах отображения.

SmartFox 22.11.2012 17:37

Понятно. Спасибо.

Правильно ли я понял, что лучше вообще всю инициализацию из конструкторов выносить,
потому что их код не кешируется?

т.е. всегда лучше написать покрайней мере так:
Код AS3:

public function ClassName () : void
{
    init ();
}
 
private function init () { /*initialization*/ }

И это будет быстрее если объекты класс ClassName создаются регулярно в процессе выполнения?

illuzor 22.11.2012 17:49

SmartFox, вы не уловили суть. Нужно убедиться, что stage доступен и уже после этого запускать основной код.

SmartFox 22.11.2012 17:53

Цитата:

Сообщение от illuzor (Сообщение 1105646)
SmartFox, вы не уловили суть. Нужно убедиться, что stage доступен и уже после этого запускать основной код.

Об этом я как раз догадался по строке if (stage) init(); в коде из Flash Develop. Просто меню удивило, что среда выполнения может создать объект моего класса до того, как создала stage. Оказывается может.

AlexCooper 22.11.2012 18:08

прошу не путать грешное с праведным.

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

addChild();


dimarik 22.11.2012 18:10

AlexCooper. Есть частный случай. В primary документ-классе, который является корневым, stage доступен в конструкторе.

AlexCooper 22.11.2012 18:12

Пример

Код AS3:

var test = new inits();
trace(test.DATA); // 0
addChild(test);
trace(test.DATA); // 1

Код AS3:

package  {
 
        public class inits {
 
                public var DATA:Number = 0;
 
                public function inits() {
                        if (stage) init()
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event):void {
                        DATA = 1;
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                }
 
        }
 
}

Добавлено через 1 минуту
Цитата:

Сообщение от dimarik (Сообщение 1105650)
AlexCooper. Есть частный случай. В primary документ-классе, который является корневым, stage доступен в конструкторе.

C этим согласен, так как корневой "Main" сам себя добавляет на сцену и ему не нужен
Код AS3:

addChild()


dimarik 22.11.2012 18:19

Та не! У него в конструкторе уже есть стейдж. Объект еще не создан, но уже добавлен на сцену, вот что вызывает уважение к уличной магии!

SmartFox 22.11.2012 18:23

Вот опять запутали! Если в primary документ-классе, который является корневым, stage доступен в конструкторе, то зачем там танцы с эвентами? Только на случай загрузки одной флешки в другую?

AlexCooper 22.11.2012 18:34

Главное запомнить то что stage доступен только тогда когда экземпляр добавлен на сцену. В случае с главным документ-классом он добавлен на сцену автоматически. В вложенных классах использовать ADDED_TO_STAGE нужно для передачи всех параметров. К примеру если вы передаете различные параметры (как пример цвет текста, сам текст, ссылки на картинки) и во время инициализации вам эти параметры нужны. Методом init вы конролируете что будет собран весь спектр параметров и полная инициализация будет произведена выполнением команды
Код AS3:

addChild()

Добавлено через 4 минуты
ну и соответственно непосредственно следует использовать когда нужен безотказный вызов
Код AS3:

stage


SmartFox 22.11.2012 18:39

Цитата:

Сообщение от AlexCooper (Сообщение 1105657)
Главное запомнить то что stage доступен только тогда когда экземпляр добавлен на сцену.

Вот этого я не знал. Спасибо.

КорДум 22.11.2012 18:52

Цитата:

Правильно ли я понял, что лучше вообще всю инициализацию из конструкторов выносить, потому что их код не кешируется?
Верно. Естественно, это знание логично реализовать в классах, конструктор которых вызывается чаще одного раза =)

SmartFox 22.11.2012 19:02

КорДум, это тоже полезная для меня инфа. Спасибо. Я обычно инициализацию всяких пуль и обломков, которых создается множество, прямо в конструкторе делал(ну т.е. задавал им скорости, ускорения и прочее), а оказывается лучше было из конструктора вынести в отдельную функцию. Кстати, в AS2 тоже так было?

Честно говоря странно это немножко. Во всяком случае после С++. Конструкторы-то как раз и придуманы, что в них инициализацию проводить...

AlexCooper 22.11.2012 19:31

Это верно, и никто Вас не заставляет выносить инициализацию за конструктор. Дело лишь в доступе к сцене. Если она Вам нужна, тогда лучше вынести если stage вам безразличен или вас не смущает запись типа
Код AS3:

var example:Class = new Class(param1,param2,param3,...paramn)

или не сложно инициализацию запускать вручную
Код AS3:

var example:Class = new Class();
example.param1 = 1;
example.param2 = 2;
example.init();

тогда нет необходимости в использовании
Код AS3:

ADDED_TO_STAGE

Добавлено через 1 минуту
p.s. все дело в параметрах которые Вам нужны. Отталкиваться нужно от задачи которую выполняет класс, нужен ли там ADDED_TO_STAGE или нет зависит только от этого.

КорДум 22.11.2012 21:33

Цитата:

Кстати, в AS2 тоже так было?
Черт его знает. Знаю только одно, AVM1 кардинально отличается от AVM2.

Цитата:

Конструкторы-то как раз и придуманы, что в них инициализацию проводить...
Так здесь и получается, что в конструкторе инициализация, если закрыть глаза на то, что все вынесено в приватный метод с заурядным названием init() =) Просто она вынесена в угоду производительности и из-за особенности работы FP.

Simplifier 22.11.2012 21:59

Цитата:

Сообщение от КорДум (Сообщение 1105636)
Код в конструкторе интерпретируется FP каждый раз, когда его вызов встречается в коде, вместо того, чтобы кэшировать в памяти все интерпретированное, что происходит с методами, например. Поэтому тратится больше времени на вызов конструктора.

Хочется увидеть подробности, пруфлинки, причинно-следственные связи и тд.

КорДум 22.11.2012 22:19

Димарик, Ваш выход )
Я лишь пользовался тем, что скромно одним глазком подсмотрено у наших гуру.

dimarik 23.11.2012 10:09

http://jacksondunstan.com/articles/276

И так, для разнообразия.


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

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