Архитектура приложения

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в Flash-приложениях (ActionScript)
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Архитектура приложения

Сообщение Agiliter »

День добрый! :)
Мысль создать своё, хоть и очень простенькое вк приложение еще сохранилась. Азы, вроде, узнал и опробовал на практике. Проблема (основная, по крайней мере) только в грамотном планировании структуры программы. Без ООП, естественно, никуда. Сначала изложу свой первоначальный вариант. Имеется главный класс Main, в котором всего пара строчек кода. Имеются два больших класса: Класс самой игры MyGame и класс отображения игры на экране MyGameView.
Также множество дополнительных классов вынесены отдельно. Класс взаимодействия с сервером, класс создания новых окон в игре, класс взаимодействия с вк апи, класс для загрузки изображений и т.д. Эти классы опробованы и пока что работают. В планах создать отдельные классы для инвентаря, для магазина и для битвы.
Теперь нужно соединить это всё в кучу. Моим первым вариантом было следующее: Main запускает класс MyGame, и вся кухня варится внутри. Примерно так

Код: Выделить всё

        public function MyGame(flashVars:Object)         {                        myGameView = new MyGameView();            addChild(myGameView);                          agentVK = new AgentVK(data);            agentVK.getProfiles('first_name, last_name, photo, photo_big, country, online');                         myCliSer = new MyClientServer(uid,"csriptName");        }
Но этот вариант провалился. Ибо взаимодействие с пользователем происходит через класс MyGameView, а изменения при этом должны происходить в классе MyGame.

Другой вариант, о котором я подумал совсем недавно - это создать объект класса MyGame в классе MyGameView и совершать все операции уже с ним. Но не знаю, стоит ли жестко привязывать один класс к другому.

Может быть есть лучшие варианты?

P.S. Я знаю, что это мало вероятно (и вряд ли кто-то захочет), но может быть, у кого-нибудь есть ненужный код. Хочу посмотреть на пример организации "больших" приложений. Начал читать Сандерс Б., Кумаранатунг Ч. - ActionScript 3.0. Шаблоны проектирования - 2011, но пока толку не особо много.
Аватара пользователя
alexandr_ratush
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47

Re: Архитектура приложения

Сообщение alexandr_ratush »

То что вы начали читать книгу ActionScript 3.0. Шаблоны проектирования это правильно, и когда дойдете к главе 12, то вы найдете все ответы на вопросы. Вам нужно ознакомится с МВЦ, и понять как оно все работает. Тогда вы сможете выбрать правильный путь (так как тех же реализаций и вариаций МВЦ очень много) в построении архитектуры приложений.
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Архитектура приложения

Сообщение Agiliter »

alexandr_ratush писал(а):Вам нужно ознакомится с МВЦ, и понять как оно все работает. Тогда вы сможете выбрать правильный путь (так как тех же реализаций и вариаций МВЦ очень много) в построении архитектуры приложений.
MVC очень хорошо подходит в данном случае. Но концепция не совсем понятна.
Программа разбивается на три части:
Model - класс для хранения данных. Никакой логики, только данные.
View - класс, наследник Sprite-а. Содержит в себе всю графику. Предназначен только для отображения. Имеет ряд публичных методов, доступных контроллеру, с помощью которых последний ею управляет.
Controller - мозг приложения. Содержит в себе логику и ничего кроме логики.
Возник ряд вопросов. Например, какая часть взаимодействует с БД и php-скриптами? Модель или контроллер? Или же контроллер загружает данные с БД и передает их в Model, при этом View отображает изменения в модели в соответствии с новыми значениями?
Какая часть взаимодействует с vk API?
Аватара пользователя
alexandr_ratush
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47

Re: Архитектура приложения

Сообщение alexandr_ratush »

какая часть взаимодействует с БД и php-скриптами? Модель или контроллер?
У меня это работает так:
Пишется класс, к примеру ServerCommand для взаимодействия с сервером.
В контролере создаем объект типа ServerCommand. Полученный ответ обрабатываем в контролере, и передаем результат в модель.
Это мое видение MVC. Может оно не очень доскональное, так как я сам его использую чуть больше полу года.
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Архитектура приложения

Сообщение Agiliter »

alexandr_ratush писал(а):Пишется класс, к примеру ServerCommand для взаимодействия с сервером.
В контролере создаем объект типа ServerCommand. Полученный ответ обрабатываем в контролере, и передаем результат в модель.
Спасибо. Я примерно так и думал касательно php-скриптов. А вот как быть с апи вконтакте? Я создавал отдельный класс для взаимодействия с ним. Получается, что в Main определяем flashvars как объект и передаем его в контроллер, который в свою очередь передает его в класс для взаимодействия с вк апи. Но это как-то коряво получается. А как иначе получить данные о пользователе я не знаю.
Аватара пользователя
alexandr_ratush
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47

Re: Архитектура приложения

Сообщение alexandr_ratush »

в Main определяем flashvars как объект и передаем его в контроллер, который в свою очередь передает его в класс для взаимодействия с вк апи. Но это как-то коряво получается.
Почему? Вполне нормальный подход. В данном случае мне кажется нормальный вариант.
Модель же тоже stage не содержит в себе :)
И с вьювера передавать тоже глупо. А так точка входа в программу Main, и там вы инициализируете данные с ВК.

Только передавать в контроллер лучше уже объект с данными, а не ссылку на stage. Или вы так и делаете? ;)
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Архитектура приложения

Сообщение Agiliter »

alexandr_ratush писал(а): Только передавать в контроллер лучше уже объект с данными, а не ссылку на stage. Или вы так и делаете? ;)
Делаю примерно так

Код: Выделить всё

        private var flashVars:Object;         public function Main()         {            trace("Запущен класс Main");            flashVars = stage.loaderInfo.parameters as Object;                              if (!flashVars.api_id)            {                trace("local testing");// -- Your code for local testing:flashVars['api_id'] = 7777777;flashVars['viewer_id'] = 88888888;flashVars['sid'] = "хххххххххххххххххххххххххххххххххххххххххххх";flashVars['secret'] = "хххххххх";// -- //            }                        newGame(flashVars);                         }
где newGame

Код: Выделить всё

         private function newGame(data:Object):void         {            var view:View = new View();            var model:Model = new Model();             var controller:Controller = new Controller(view, model, data);            controller.init();            addChild(view);        }
Аватара пользователя
alexandr_ratush
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47

Re: Архитектура приложения

Сообщение alexandr_ratush »

Ага, вот не подумал сразу. :)
flashVars нужно сохранять в модели, а в контролере уже выбирать что нужно для работы.
Создайте в модели приватные свойства типа _apiId и т.д. А из контролера получайте доступ с помощью геттеров.
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Архитектура приложения

Сообщение Agiliter »

alexandr_ratush писал(а):flashVars нужно сохранять в модели, а в контролере уже выбирать что нужно для работы.
Создайте в модели приватные свойства типа _apiId и т.д. А из контролера получайте доступ с помощью геттеров.
Не уверен, что правильно Вас понял. У меня для взаимодействия с вк апи был написан свой класс (AgentVK), в котором реализованы различные методы доступа к информации

Код: Выделить всё

        private var VK:APIConnection;        private var api_id:String;        private var viewer_id:String;        private var sid:String;        private var secret:String;         public function AgentVK(data:Object)         {            trace("Запущен класс AgentVK");            api_id =       data.api_id;            viewer_id =    data.viewer_id;            sid =          data.sid;            secret =       data.secret;                       // инициализация            VK = new APIConnection(data);        }
Вы предлагаете не пользоваться им? Или пользоваться им в модели? Я думал, что логичнее передавать flashVars в контроллер, а оттуда в AgentVK. Но что-то запутался. Ведь и впрямь модель должна отвечать за хранение данных.
Аватара пользователя
alexandr_ratush
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47

Re: Архитектура приложения

Сообщение alexandr_ratush »

Или пользоваться им в модели?
Нет в контролере.
Я думал, что логичнее передавать flashVars в контроллер, а оттуда в AgentVK.
По хорошему тону нужно чтобы данные находились в одном хранилище, и это будет модель.
Передаете данные в модель, а в контролере в агент передаете их из модели.

Пример из контролера:

Код: Выделить всё

var _agentVK:AgentVK = new AgentVK(_model.socialData);
Если через некоторое время у вас появиться агент по управлению космическим кораблем, то вы без проблем передадите данные из модели, и будете спокойны и уверены что они такие же как и в агента ВК. :D
Ответить