Показать сообщение отдельно
Старый 04.11.2011, 18:45
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 4  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,600
Записей в блоге: 17
Много разно думал-делал, и пришел к выводу, что мне совсем не нравится "общая" для всех идея: писать фреймворк для сериализации и десериализации.
Поэтому как делаю я:
У меня есть коннектор к соц сети: SocialNetwork. У него есть метод send, который принимает в качестве аргумента SocialBaseCommand.
У SocialBaseCommand обязан быть наследник, в котором переопределены методы serialize и execute: первый сериализует команду на сервер, второй её парсит и делает то что надо. При переносе системы на другой проект код во всяком случае десериализации пишется заново. Мультисоциальность того и другого достигается путем условной компиляции.
Пример:
Код AS3:
var command:SocialBaseCommand = _socialNetork.send(new Get(friendUIDs);
command.addEventListener(Event.COMPLETE, onCompleteHandler);
Код AS3:
package social.commands.friends {
	import social.custom.CustomSocialCommand;
 
	public class Get extends CustomSocialCommand {
		private var _uid:String;
 
		public function Get(uid:String = null) {
			super();
			_uid = uid;
			super.commandAPIName = "friends.get";
		}
 
		protected override function serialize():void {
			super.body.uid = _uid;
			super.serialize();
		}
 
		protected override function execute():void {
			super.execute();
		}
 
	}
 
}
Внутри этого примера какие-то действия будут совершенны внутри хэндлера onCompleteHandler, по ответу.
У команды есть публичное поле response, в который кладется ответ.
Парсинг может происходить внутри execute:
Код AS3:
protected override function execute():void {
	if (!Boolean(super.response)) {
		super.baseController.catapulting("Для игры Вам необходимо установить приложение.");
	}
	super.execute();
 
}
Если надо добавить несколько соц. сетей, то сначала парсинг разных форматов через условную компиляцию, потом обращаемся:
Код AS3:
var uids:String;
CONFIG:SOCIAL1 {
uids=super.response.friends;
}
CONFIG::SOCIAL2{
uids=super.response.some_other_field;
}
super.baseModel.getSomeModel().uids=uids;
Сериализацией и десериализацией занимается отдельный класс, который имплементит IApiAdapter. Не совсем адаптер, но мне нравится его так называть.
2 главных метода там:
Код AS3:
function serialize(command:SocialBaseCommand):URLLoader;
function get decoderFunction():Function;
Например вот сериализация от OKAdapter:
Код AS3:
		public function serialize(command:SocialBaseCommand):URLLoader {
			var urlLoader:URLLoader = new URLLoader();
			var vars:URLVariables = signRequest(command.body);
			var commandType:String = command.commandAPIName.split(".").join("/");
			var urlRequest:URLRequest = new URLRequest(FlashVars.OK_SOCIAL_API_URL + commandType);
			urlRequest.data = vars;
			urlLoader.load(urlRequest);
			return urlLoader;
		}