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

Tayrus 07.04.2012 16:58

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

Дело собственно вот в чем, при инициализации приложения я загружаю данные с сервера. Беру псевдоним каждого класса и создаю объекты в своем приложении.

Перед этим я регистрирую все классы, которые есть в моем приложении. Для этого создал класс

Код AS3:

package 
{
 
        import flash.net.registerClassAlias;
        import flash.net.getClassByAlias;
 
        final public class CMyClassList {
 
                public function CMyClassList() {
 
                        registerClassAlias("Class1", CClass1);
                        registerClassAlias("Class2", CClass2);
                        registerClassAlias("Class3", CClass3);
 
                        registerClassAlias("ClassN", CClassN);
                }
 
                public function getClass(alias:String):Class {
 
                        var className:Class;
 
                        className = getClassByAlias(alias);
 
                        return className;
                }
 
        }
 
}

Как видно из кода... чтобы добавить новый класс в приложение мне надо в этом классе вручную добавить этот новый класс. И всегда надо учитывать у какого класса какой псевдоним. Если я вдруг по каким-то причинам изменю псевдонимы в базе данных, то при инициализации нужный класс не зарегистрируется(не знаю зачем мне надо будет менять, но, мало ли...).

Вопрос собственно вот в чем, как сделать так чтобы не вбивать каждый раз вручную новый класс и его псевдоним. Я думал может в самом классе сделать статическую переменную типа

Код AS3:

        private static const CLASS_ALIAS:String = "CClassNumberBillion";

а потом уже выковыривать этот псевдоним... но, если честно, ни к чему не пришел... чет запутался.

wvxvw 07.04.2012 22:30

В SDK есть такая утилита, называется swfdump вызываете ее с вашей флешкой и получаете список всех классов, например, так:

Код:

$ ./swfdump -noglyphs ./foo.swf | grep "<DoABC" | grep -oP "'[^']+'"
Из чего можно сгенерировать отдельный класс, который их всех зарегистрирует.

флешку нужно компилировать для отладки, потому что иначе DoABC теги сливаются в один.

Tayrus 08.04.2012 00:32

Не-не... тут тоже что-то типа "вручную"... надо заранее откомпилять...

Просто, я думал, может можно как-то типа указать пакет
Код AS3:

import   mySuperApp.*;

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

switch(alias) {
        case "Class A":
                object = new CClassA();
.....................................................
 
}


in4core 08.04.2012 00:49

А зачем вообще нужна эта регистрация классов, что это дает ? где это может понадобится и т.п. ? Я просто сколько уже пишу, но ни разу не пользовался этим.

wvxvw 08.04.2012 15:21

Обычно класс регистрируют с тем же именем, которое у него во флеше, т.е.:

Код AS3:

registerClassAlias(getQualifiedClassName(serializedClass), serializedClass);

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

Еще вариант - сложите все классы, которые нуждаются в сериализации в одну папку, и в билд скрипте на основании содержимого папки генерируйте класс, который регистрирует алиасы. (Я бы так делал, скорее всего).

Tayrus 08.04.2012 16:56

Цитата:

Сообщение от in4core (Сообщение 1073649)
А зачем вообще нужна эта регистрация классов, что это дает ? где это может понадобится и т.п. ? Я просто сколько уже пишу, но ни разу не пользовался этим.

Наверное, я не совсем корректно тут задал вопрос, в общем... постараюсь еще раз подробнее объяснить ))

Вот пользователь запускает ваше приложение... игру или еще что... Все данные для инициализации хранятся на серваке, а может и локально... Вы загружаете эти данные и....

Вариант №1

Код AS3:

 
                        for (var item in myAppObjects) {
 
                                if (item == "CClassAlias_0001") {
 
                                        object = new CClassAlias_001();
                                }
 
                                if (item == "CClassAlias_0002") {
 
                                        object = new CClassAlias_002();
                                }
                                /****************************************/
 
 
                        }

Вариант №2

Код AS3:

 
        // Вариант №2 (что, в принципе, не так уже сильно по моему мнению отличается от варианта 1)
        for (var item in myAppObjects) {
 
                switch(item) {
 
                        case "CClassAlias_0001":
                                object = new CClassAlias_001();
                                break;
 
                        case "CClassAlias_0002":
                                object = new CClassAlias_002();
                                break;
 
                }
 
        }

Вариант №3

Код AS3:

 
//        А вот третий вариант на сегодняшний день, который я решил применить, но... тоже не очень удовлетворяет
 
var cls:Class;
var obj:*;
 
//        Регистрируем все свои классы
var registerAllAlias:CMyClassAliasList = new CMyClassAliasList();
 
// Затем, подгрузив данные...
 
for (var item in myAppObjects) {
 
        cls = getClassByAlias(myAppObjects["classAlias"]);
 
 // Вот тут у меня тоже возникло затруднение с тем как передавать параметры...
// раздельно или целым объектом, т.к. мы же не знаем объект какого именно
// класса создается и какие ему нужны параметры и в каком порядке они должны стоять...
// Можно сделать кучу проверок, но... все же склоняюсь к передаче объекта, а уже внутри
// проверять все ли параметры на месте и т.д.
 
        obj = new cls();
 
}

Одним словом, все это я навыдумал для инициализации своего приложения и хотел узнать как вообще люди инициализируют свое приложение с помощью сохраненных данных

Спасибо wvxvw за предложенные варианты, буду пробовать.

alatar 08.04.2012 17:31

getDefinitionByName

Добавлено через 58 секунд
P.S. Классы должны быть в конечной swf (вкомпилированы или загружены).

Tayrus 08.04.2012 18:48

Цитата:

Сообщение от alatar (Сообщение 1073735)
getDefinitionByName

Добавлено через 58 секунд
P.S. Классы должны быть в конечной swf (вкомпилированы или загружены).

Спасибо!!! Почитаю сегодня

Добавлено через 11 часов 19 минут
Что-то не совсем получается с getDefinitionByName. Выдает ошибку что переменная не определена.

Код AS3:

 
var ClassReference:Class = getDefinitionByName("CFence") as Class;

НО, нашел сайт, на котором человек тоже говорил об этой ошибке и предложил след. вариант

Код AS3:

 
        CFence;
        var ClassReference:Class = getDefinitionByName("CFence") as Class;

причем, если изменить первую строчку на

Код AS3:

        var CFence;
 
//  или
 
        var CFence:Class;

компилятор ругается....

Для примера с сайта адоба не нужно ничего выдумывать... там все чисто работает... Почему? И как с этим бороться?

alatar 09.04.2012 11:02

Еще раз:
Цитата:

P.S. Классы должны быть в конечной swf (вкомпилированы или загружены).
Вот это:
Цитата:

НО, нашел сайт, на котором человек тоже говорил об этой ошибке и предложил след. вариант
Костыль. Неиспользуемые классы не попадают в конечную swf. Вы можете принудительно добавить классы через опции компилятора или загрузив swf с необходимыми классами и вызвав getDefinitionByName в ApplicationDomain в который была загружена эта swf (если грузили в currentDomain, то просто вызвать getDefinitionByName).

Цитата:

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

in4core 09.04.2012 12:31

Tayrus

Код AS3:

var ClassReference:Class = getDefinitionByName("CFence") as Class;

Я могу понять такую писанину в утилитных классах, каких нить AliasManager или типа того, которые для обычного пользователя / программиста при нормальной архитектуре не несут никакой пользы. Я так и не понял надобность использования ваших подходов ВООБЩЕ, я думаю проблема в архитектуре которую вы создали


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

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