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

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

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

Регистрация: Jan 2013
Сообщений: 126
Question AS3 MVC

Привет.
Создаю на Эйр небольшое приложение для телефона. Думаю все таки понять суть и создать свой кастомный MVC. До этого имел дело с PureMVC, Robotlegs, SomaFramework и т.д. Давно привык использовать готовые фреймворки, чем изобретать свой велик.
В общем, прочитав несколько статеек про MVC, вроде все ясно

Код AS3:
var model:Model = new Model();
var controller:Controller = new Controller(model);
var view:View = new View(model, controller);
addChild(view);
Но везде пишут только про стартовый запуск паттерна, а как двигаться дальше? Скажем, если у меня 10 моделей, 20 контроллеров и дофига вьюшек, как все это связать в одно целое?

Пример - создаю отдельный класс вью для фонового рисунка, возможно в будущем фон будет плавно меняться на другой рисунок. Для фонового класса создал модель и контроллер. Контроллер слушает главную модель приложения (ассетслоадер), после успешной загрузки изменяет свою модель, вьюшка в свою очередь добавляет на сцену. Не знаю, правильно ли это.
Таких классов может быть много. И плодить по несколько сотен new для каждой вьюшки, модели, контроллера, как то накладно.

Буду очень благодарен за любые советы.


Последний раз редактировалось namespaces; 24.02.2016 в 03:21.
Старый 24.02.2016, 09:11
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Бэкграунд является Данными приложения? Как говорится, нафига козе модель.

Добавлено через 2 часа 15 минут
Такой подход, действительно, распространен — когда "любое изменение на экране должно инициироваться Моделью". Но это вовсе не значит, что он хорош и обязателен. Это избыточность архитектуры.
Модель должна заниматься данными: хранить их и обрабатывать, производить вычисления и осуществлять логику Приложения. Если изменение фоновой картинки никак не влияет на логику приложения и его данные, оно никак не связано с Моделью. Ваше затруднение возникает из-за того, что Вы абстрагируете фоновую картинку в отдельную самостоятельную триаду MVC, создавая таким образом отдельное самостоятельное приложение "Меняющийся фон". В рамках этого приложения всё законно, есть модель, хранящая данные о всех картинках, текущей картинке, и вычисляющая следующую картинку и момент изменения, и посылающая событие для Вью. Вопрос только в том, нужна ли эта триада "главному" MVC Приложения, или может прекрасно существовать в его Вью. Ведь всё, чем "Меняющийся фон" занимается, имеет отношение только к Вью и никак не меняет данные самого Приложения. Если завтра Вы захотите поставить на фон видеоролик, или скриптованую 3D-сценку, это никак не отразится на логике Приложения. Это вопрос только отображения, и им должна заниматься Вью. Для того Вью и отделяли от Модели, чтобы совершенно свободно менять варианты отображения, не внося никаких изменений в логику.
Ну а после того, как Вы согласитесь, что место этой штуке — во Вью, скорее всего отпадет и необходимость оформлять ее как MVC: контроллеру там нечего контролировать, нет никакой интерактивности; нет Данных и логики, которые был бы смысл защитить в Модели. Есть только Вью со СКРИПТОМ, или, как говорили раньше, сценарием. Простым самодостаточным сценарием, независящим ни от чего.
Даже если смена картинки подразумевается не по таймеру, а при переходе Приложения к другому "разделу" или "состоянию", то это изменение является глобальным для всего Вью и должно инициироваться из Вью. То есть Вью получает от Модели событие смены Состояния, а смена картинки является частью реакции Вью.
__________________
Reality.getBounds(this);

Старый 24.02.2016, 13:31
namespaces вне форума Посмотреть профиль Отправить личное сообщение для namespaces Найти все сообщения от namespaces
  № 3  
Ответить с цитированием
namespaces
 
Аватар для namespaces

Регистрация: Jan 2013
Сообщений: 126
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Бэкграунд является Данными приложения? Как говорится, нафига козе модель.
Спасибо за развернутый ответ.
Насчет бекграунда скорее всего так и сделаю. Это просто был пример.

Представим, что приложение имеет подключение к базе данных, читает конфиг файл и для сохранения состоянии (сессии) записывает данные в Sharedobject. А также несколько окошек, игровую сцену, звуки и т.д.
Окошки в виде уведомлений могут всплывать в разное время, если отсутствует подключение или проблемы с базой данных, то вместо ошибки молча записывать-читать с локального файла.
Вопрос лишь в том, как Вид слушает ответ от 5 моделей? Какая роль у контроллера? Кто добавляет этих окошек на сцену?

Старый 24.02.2016, 14:16
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
редставим, что приложение имеет подключение к базе данных, читает конфиг файл и для сохранения состоянии (сессии) записывает данные в Sharedobject.
Это Модель.
Цитата:
А также несколько окошек, игровую сцену, звуки и т.д.
Это Вью.
Цитата:
Вопрос лишь в том, как Вид слушает ответ от 5 моделей?
MVC это не паттерн, а парадигма. Паттернов в нем может быть еще десяток разных. Если Вам действительно необходимы 5 моделей (а это не факт), можно сделать им Фасад. Можно и не делать, а иметь 5 "независимых" MVC. Это уж надо решать в конкретной ситуации.
Цитата:
Какая роль у контроллера?
Разделить Вью и Модель так, чтобы не было жесткой связности. То есть, чтобы Вью не пришлось импортировать Модель (что явный нонсенс). Вообще, в отличие от вашего представления в первом посте, Вью и контроллер-то не импортирует и не имеет на него ссылки. Потому что Вью должна только посылать события о том, что юзер сделал то-то и то-то. У Вью нет логического языка, то есть Вью не может формулировать сообщения в виде "юзер убил танк №112". Вью не берет на себя логику. Вью может сообщать только "юзер нажал клавишу Пробел". И вот здесь, по парадигме MVC, включается контроллер, поскольку Модель живет в своем мире Данных и понятия не имеет ни о каких клавишах и мышках. Контроллер — тот, кто Знает, что именно в текущем режиме Приложения делает клавиша Пробел. Какой именно метод Модели надо вызвать. Потому что в режиме Меню клавиши "делают" одно, в режиме Чата другое, в Инвентаре — третье, а в бою — четвертое. Контроллер контролирует действия юзера в зависимости от режима (mode), в котором находится Приложение. Переключение этих режимов может менять сами контроллеры (почему, собственно, выгодна схема с событиями от Вью а не вызовами методов контроллера напрямую — замена контроллера в такой ситуации была бы крайне затруднительна). Таким образом контроллеры инкапсулируют в себе поведение. Не логику Игры, не вычисления, а именно трактовку действий юзера в условиях текущего Состояния приложения, характер интерактива. Потому что эту трактовку не может себе позволить ни Вью, максимально удаленная от логики и данных, ни Модель, максимально удаленная от способа отображения данных и взаимодействия с пользователем.
__________________
Reality.getBounds(this);

Старый 24.02.2016, 16:04
namespaces вне форума Посмотреть профиль Отправить личное сообщение для namespaces Найти все сообщения от namespaces
  № 5  
Ответить с цитированием
namespaces
 
Аватар для namespaces

Регистрация: Jan 2013
Сообщений: 126
Теперь все стало понятно, разложили все по полочкам. Спасибо за помощь.

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:16.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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