Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.04.2012, 16:58
Tayrus вне форума Посмотреть профиль Отправить личное сообщение для Tayrus Найти все сообщения от Tayrus
  № 1  
Ответить с цитированием
Tayrus
 
Аватар для Tayrus

Регистрация: Apr 2012
Сообщений: 12
По умолчанию Вопрос по регистрации всех классов приложения

Всем доброго времени суток!

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

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

Код 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";
а потом уже выковыривать этот псевдоним... но, если честно, ни к чему не пришел... чет запутался.

Старый 07.04.2012, 22:30
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
В SDK есть такая утилита, называется swfdump вызываете ее с вашей флешкой и получаете список всех классов, например, так:

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

флешку нужно компилировать для отладки, потому что иначе DoABC теги сливаются в один.
__________________
Hell is the possibility of sanity

Старый 08.04.2012, 00:32
Tayrus вне форума Посмотреть профиль Отправить личное сообщение для Tayrus Найти все сообщения от Tayrus
  № 3  
Ответить с цитированием
Tayrus
 
Аватар для Tayrus

Регистрация: Apr 2012
Сообщений: 12
Не-не... тут тоже что-то типа "вручную"... надо заранее откомпилять...

Просто, я думал, может можно как-то типа указать пакет
Код AS3:
import   mySuperApp.*;
и в следующий раз при добавлении нового класса или еще каких крэкс-пэкс-фэксов.... мой класс CMyClassList каким волшебным образом выковыряет все классы, которые есть в этом пакете и зарегистрирует их. Ну а сами псевдонимы классов будут внутри класса как статичный член... Мммм... наверно, получилось как то сумбурно .. Просто, может люди с правильно приделанными руками делают все это как-то легче.... Просто, я не думаю что они делают при инициализации приложения(т.е. при получении данных с сервера) что-то типа
Код AS3:
switch(alias) {
         case "Class A":
                 object = new CClassA();
.....................................................
 
}

Старый 08.04.2012, 00:49
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 4  
Ответить с цитированием
in4core
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
А зачем вообще нужна эта регистрация классов, что это дает ? где это может понадобится и т.п. ? Я просто сколько уже пишу, но ни разу не пользовался этим.
__________________
Марк Tween

Старый 08.04.2012, 16:56
Tayrus вне форума Посмотреть профиль Отправить личное сообщение для Tayrus Найти все сообщения от Tayrus
  № 5  
Ответить с цитированием
Tayrus
 
Аватар для Tayrus

Регистрация: Apr 2012
Сообщений: 12
Цитата:
Сообщение от in4core Посмотреть сообщение
А зачем вообще нужна эта регистрация классов, что это дает ? где это может понадобится и т.п. ? Я просто сколько уже пишу, но ни разу не пользовался этим.
Наверное, я не совсем корректно тут задал вопрос, в общем... постараюсь еще раз подробнее объяснить ))

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

Вариант №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 за предложенные варианты, буду пробовать.

Старый 08.04.2012, 15:21
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Обычно класс регистрируют с тем же именем, которое у него во флеше, т.е.:

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

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

Старый 08.04.2012, 17:31
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 7  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
getDefinitionByName

Добавлено через 58 секунд
P.S. Классы должны быть в конечной swf (вкомпилированы или загружены).
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 08.04.2012, 18:48
Tayrus вне форума Посмотреть профиль Отправить личное сообщение для Tayrus Найти все сообщения от Tayrus
  № 8  
Ответить с цитированием
Tayrus
 
Аватар для Tayrus

Регистрация: Apr 2012
Сообщений: 12
Цитата:
Сообщение от alatar Посмотреть сообщение
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;
компилятор ругается....

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

Старый 09.04.2012, 11:02
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 9  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Еще раз:
Цитата:
P.S. Классы должны быть в конечной swf (вкомпилированы или загружены).
Вот это:
Цитата:
НО, нашел сайт, на котором человек тоже говорил об этой ошибке и предложил след. вариант
Костыль. Неиспользуемые классы не попадают в конечную swf. Вы можете принудительно добавить классы через опции компилятора или загрузив swf с необходимыми классами и вызвав getDefinitionByName в ApplicationDomain в который была загружена эта swf (если грузили в currentDomain, то просто вызвать getDefinitionByName).

Цитата:
причем, если изменить первую строчку на
Вы пытаетесь назвать переменную назвать также как и класс, я бы тоже ругался. В приведенном примере просто упоминается класс. Этого достаточно, хоть и костыльно.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 09.04.2012, 12:31
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 10  
Ответить с цитированием
in4core
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Tayrus

Код AS3:
var ClassReference:Class = getDefinitionByName("CFence") as Class;
Я могу понять такую писанину в утилитных классах, каких нить AliasManager или типа того, которые для обычного пользователя / программиста при нормальной архитектуре не несут никакой пользы. Я так и не понял надобность использования ваших подходов ВООБЩЕ, я думаю проблема в архитектуре которую вы создали
__________________
Марк Tween

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:07.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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