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

Babylon 10.01.2014 18:40

Правильно. Контроллеры общаются друг с другом посредством диспатчей, а обрабатывают события в хэндлерах, где и передают данные сервис<-> вид, либо сервис<->логика(модель).

Dukobpa3 10.01.2014 18:53

Цитата:

подсмеивались из-за "ядра"
Смеялись не из-за ядра, а из-за хмл-мвц:)
Да и мне до сих пор система не понятна, а пример бы посмотрел. Теоретически должно адекватно смотреться в связке с флексом.

Babylon 10.01.2014 19:00

Я учёл пожелания. Теперь у меня по другому сделано. Есть дикт из коллекций MVC которые имеют свойства INodeIn и INodeOut c интерфейсом INode, где INode может быть либо XML, либо JSON. Пока еще не допилено...

Dukobpa3 10.01.2014 19:52

Цитата:

Сообщение от 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);


Psycho Tiger 16.01.2014 00:44

Цитата:

Вот пример использования костыльного манагера, который я показывать не хочу
По хорошему, пользовательский код может вполне себе положить на манагер и работать исключительно с командами. То есть, вшить все эти связки с CommandManager в саму команду и сократить код примерно так:
Код AS3:

new BattleTurnDto().executeCommand().addCompleteListener(completeHandler);

Такой подход ты считаешь костыльным?

Dukobpa3 16.01.2014 01:08

I hate JQuery

Добавлено через 46 секунд
Предложенный вариант не избавит от безымянных, непонятно где висящих объектов, а только добавит их.

Добавлено через 3 часа 11 минут
И, кстати, чем вот это:
Код AS3:

new BattleTurnDto().executeCommand().addCompleteListener(completeHandler);

Отличается от вот этого.

Psycho Tiger 16.01.2014 11:38

Это не JQuery, а method chaining :)

Можешь набросать примерно, как с точки зрения пользовательского кода выглядит хорошая на твой взгляд система?

in4core 16.01.2014 14:39

Я думаю не сможет.
Тут сам по себе подход сервера убог, а значит сделать под него хорошую систему уже не получится.
Как мне кажется не стоит выдумывать какие то велосипеды на клиенте, когда сервер-сайд хренов. Надо менять сервер.
В момем случае стояла задача сделать БЫСТРО, и чтобы работало. 3-5 дней на реализацию подкладки. Понятное дело, если бы сроки были приемлимые, можно было бы сделать нормальтной эко систему, но тут пришлось безоговорочно работать с тем, что написано уже давно.

GBee 16.01.2014 14:50

Цитата:

Тут сам по себе подход сервера убог, а значит сделать под него хорошую систему уже не получится.
Какой-то вы странный. Вы делаете запрос, вам приходит ответ. Чем подход убог? Не оправдал надежд? Или поломал ваш "универсальный" движок? Велосипеды стоит выдумывать или брать готовые, главное, чтобы задача была выполнена. Перфекционизм хорош в малых дозах, в больших количествах он заставляет писать гневные посты на форумах.

in4core 16.01.2014 15:01

GBee - если ты работаешь с медиа серверами например, у тебя есть серверные методы и сообщения. Там все понятно. Если ты работаешь с серверами типа пхп - то тут сложнее, и требуется удобная организация сервера - когда ты делаешь запрос, в ответе ты должен получать command:What_the_fox_say - чтобы значть на какую конкретно команду пришел ответ. Это не странность - это нормальность. Я же не несу фигни типа - ну а почему на сервере переменную назвали коряво? Это не мое дело. Мое дело получить ответ, который будет понятен и читабелен.
Потрачено.


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

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