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

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

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

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
rake+sprout. Справляются идеально. Генерит, компилит, деплоит.
Единственный минус (для меня), что на ruby

Старый 02.03.2011, 16:17
zhoran вне форума Посмотреть профиль Отправить личное сообщение для zhoran Найти все сообщения от zhoran
  № 2  
Ответить с цитированием
zhoran

Регистрация: Dec 2010
Адрес: Химки МО
Сообщений: 95
Переделал вот так:
Код AS3:
public class ConnectionController extends EventDispatcher
{
  ...
  protected function dataListener(event:DataEvent):void {
	ServerDataEventFactory.CreateDispatchEventFromMessage(event.data, this);
  }
}
Это контроллер коннекции с сервером, на нем висят слушатели конкретных событий сообщений приложения.

События приложения создаются здесь:
Код AS3:
public class ServerDataEventFactory
{
  private static var EventsTable:Object = { 
    "table_state":ServerDataTableState,
    "user_left":ServerDataUserLeft, # класс события
    "user_sit":ServerDataUserSit,
    "user_folded":ServerDataUserFolded,
    "user_raised":ServerDataUserRaised,
    "user_called":ServerDataUserCalled 
  };
 
  public function ServerDataEventFactory() {
 
  }
 
  /**
  * Создает по message соответствующее событие и диспатчит на полученный eventDispatcher
  * @param	message - сообщение от сервера
  */
  public static function CreateDispatchEventFromMessage(message:String, 
    eventDispatcher:EventDispatcher):void {
 
    var xml:XML = new XML(message);
    var klass:Class = EventsTable[xml.localName()];
 
    eventDispatcher.dispatchEvent(klass == null ? new ServerDataUnknown(xml) : new klass(xml));
  }
 
}
Весь код разбора xml для каждого сообщения кусочно индивидуально находится в коде конструкторов классов событий. Все конструкторы событий принимают только один параметр - xml:XML

Т. о., если нужно сменить инсточник сообщений с XMLSoket на что-то другое (таймер, сценарий БДТ тестрирования, то достаточно реализовать xml формат в сообщениях нового источника и за источником ничего переделывать не надо)

wvxvw спасибо)

Добавлено через 22 минуты
Еще хочется при добавлении сообщений вообще не трогать класс ServerData. Т.к. все события по данным от сервера ServerDataUserCalled, ServerDataTableState, .. наследуют от ServerData, это можно попробовать сделать так:
Код AS3:
public class ServerData extends ServerEvent
{
	...
	//
	private static var TokenTable:Array = [];
	public static function RegisterClassToken(token:String, klass:Class):void {
		TokenTable[token] = klass;
	}
	public static function ClassFromToken(token:String):Class {
		return TokenTable[token];
	}
	//
	...
}	
public class ServerDataEventFactory
{
	/* это уже не нужно
	* private static var EventsTable:Object = { "table_state":ServerDataTableState }; 
	*/
 
	/**
	 * Создает по message соответствующее событие и диспатчит на полученный eventDispatcher
	 * @param	message - сообщение от сервера
	 */
	public static function CreateDispatchEventFromMessage(message:String, 
eventDispatcher:EventDispatcher):void {
 
		var xml:XML = new XML(message);
		var klass:Class = ServerData.ClassFromToken(xml.localName());
 
		eventDispatcher.dispatchEvent(klass == null ? new ServerDataUnknown(xml) :
new klass(xml));
	}
}
и в каждом событии регистрировать класс события в классе предке:
Код AS3:
public class ServerDataTableState extends ServerData
{
	ServerData.RegisterClassToken("table_state", ServerDataTableState );
	...
}
И тут есть вопрос: а зачем вообще регить токен? Можно же классы событий зашить в атрибут event соответствующего сообщению события
Код:
<user_left event="ServerDataUserLeft" user="Alex123" />
Сообщение будет показывать параметром какой класс события должен разбирать xml данные этого сообщения и какой объект события будет соответствовать данному сообщению.

Чем чреват такой подход?


Последний раз редактировалось zhoran; 02.03.2011 в 17:45.
Создать новую тему Ответ Часовой пояс GMT +4, время: 05:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

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

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


 


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


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