Показать сообщение отдельно
Старый 10.01.2014, 19:52
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 34  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Сообщение от in4core
Dukobpa3 - так покажи как надо!
Цитата:
Сообщение от Isfet
выложите свой кусок , чтобы было понятно как надо..,
У меня есть вот такой вот пакетик. Пользуюсь уже несколько лет.
Недавно наводил порядки там и выпилил немного костыльного функционала, в том числе и криво написанный хттп-коннектор, в итоге там остался реализован только сокет(хттп уже давно не использовал, так я и не переживал).
Но я планировал добавить туда и хттп-коннектор. Возможно как раз будет повод.
Я честно вот сегодня пытался на костылях нечто собрать чтоб сюда скинуть, но костыли мне не понравились. Сделаю адекватно, расширю функционал своего пакета. Можно за репозиторием следить.

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

Абстрактная команда. Ее расширяют наши остальные конкретные команды.
Код AS3:
package connector.commands
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
 
	import project.model.SomeModel;
 
 
	internal class Command extends EventDispatcher
	{
		protected static const SERVER_URL:String = "http://your.server.url/";
 
		protected var _urlLoader:URLLoader  = new URLLoader();
		protected var _urlRequest:URLRequest = new URLRequest();
 
		// Каким-то образом ссылка на модель должна попасть в команду.
		// не хочу об этом думать. new SomeModel точно не конает, потмоу что она должна быть одна у всех.
		// Но это как вариант, и абсолютно не факт что ссылка на модель будет в базовой команде.
		// так как каждая команда скорее всего будет работать с другой моделью.
		protected var _model:SomeModel = new SomeModel();
 
		final public function execute(data:Object):void
		{
			prepareLoader(data);
 
			_urlLoader.addEventListener(Event.COMPLETE, onRequestComplete);
			_urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onError);
 
			_urlLoader.load(_urlRequest);
		}
 
		protected function prepareLoader(data:Object):void
		{
			throw new Error("Should be overriden by sub classes");
		}
 
		protected function processData(data:Object):void
		{
			throw new Error("Should be overriden by sub classes");
		}
 
		private function onRequestComplete(e:Event):void
		{
			_urlLoader.removeEventListener(Event.COMPLETE, onRequestComplete);
			_urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onError);
 
			processData(_urlLoader.data);
		}
 
		private function onError(event:IOErrorEvent):void
		{
			trace("error");
		}
 
	}
}
Команда авторизации:
Код AS3:
package connector.commands
{
	import project.model.data.AuthResponceDo;
 
 
	internal class AuthCommand extends Command
	{
		private static const SERVICE_URL:String = "auth.php";
 
		override protected function prepareLoader(data:Object):void
		{
			// Эта команда простенькая, ниче настраивать не надо кроме урла.
			_urlRequest.url = Command.SERVER_URL + SERVICE_URL;
		}
 
		override protected function processData(data:Object):void
		{
			// парсинг будет совсем не такой, так как понятно что с сервера прилетит не этот тип Если у нас не амф.
			// для примера покатит.
			var parcedData:AuthResponceDo = data as AuthResponceDo;
 
			// Здесь просто вызывается метод модели. Но может быть любой другой набор действий.
			_model.auth(parcedData);
		}
	}
}
Команда хода в бою:
Код AS3:
package connector.commands
{
	import connector.commands.data.BattleTurnDto;
 
	import flash.net.URLRequestMethod;
	import flash.net.URLVariables;
 
	import project.model.data.TurnResponceDo;
 
 
	internal class BattleTurnCommand extends Command
	{
		private static const SERVICE_URL:String = "battle_turn.php";
 
		override protected function prepareLoader(data:Object):void
		{
			// тут команда посложнее, и она шлет во флешварах данные.
			var dto:BattleTurnDto = data as BattleTurnDto;
			if (!dto) throw new Error("а нифига, надо передать BattleTurnDto");
 
			_urlRequest.url = Command.SERVER_URL + SERVICE_URL;
 
			var variables:URLVariables = new URLVariables();
			variables.battle_id = dto.battle_id;
			variables.unit_id = dto.unit_id;
 
			_urlRequest.data = variables;
			_urlRequest.method = URLRequestMethod.GET;
		}
 
		override protected function processData(data:Object):void
		{
			// см. авторизацию. Суть та же. Это фейк.
			var parcedData:TurnResponceDo = data as TurnResponceDo;
			_model.turn(parcedData);
		}
	}
}
Вспомогательный класс структурка для команды хода:
Код AS3:
package connector.commands.data
{
	public class BattleTurnDto
	{
		public var battle_id:String;
		public var unit_id:String;
	}
}
Суть в том что на каждый месадж создаем отдельный класс который умеет слать запрос на сервер и обрабатывать ответ на него.
Эта часть сравнительно не костыльная получилась и надеюсь идею передал.

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

Добавлено через 11 минут
Вот пример использования костыльного манагера, который я показывать не хочу
Код AS3:
			CommandManager.init();
 
			CommandManager.executeCommand(CommandList.COMMAND_AUTH);
 
			var turnDto:BattleTurnDto = new BattleTurnDto();
			turnDto.battle_id = "1";
			turnDto.unit_id = "10";
			CommandManager.executeCommand(CommandList.COMMAND_BATTLE_TURN, turnDto);
__________________
Кто к нам с чем для чего - тот у нас того от того.


Последний раз редактировалось Dukobpa3; 11.01.2014 в 16:04.