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

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

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

Регистрация: Feb 2011
Сообщений: 4
По умолчанию Логика работы MVC

Допустим, у меня есть необходимость написать приложение с возможностью перетаскивания предметов.

Применяя модель MVC я пишу

Код AS3:
	public class ModelClass extends EventDispatcher
	{
		private var objects:Dictionary = new Dictionary();
		private var numObjects:Number = 0;
 
		public function ModelClass ()
		{
 
		}
		public function getObject (id:String) : RoomObject{
			//получение объекта по id
			return objects[id];
		} 
		public function addObject (obj:RoomObject) {
			//добавление объекта в массив объектов
			objects[obj.id] = obj;  
			numObjects++;
			trace("Object " + obj.id + " is added");
 
			obj.addEventListener(ModelChange.OBJECT, OnObjectChange);
			dispatchEvent(new ModelChange(ModelChange.MODEL));
		}
		public function OnObjectChange(e:ModelChange) {
			//событие изменения модели вызывается при изменении объекта в массиве
			dispatchEvent(new ModelChange(ModelChange.MODEL));
		}
Описание класса RoomObject не столь важно, у него есть 3 координаты, 3 измерения и ID.
Описание Контроллера

Код AS3:
	public class ControllerPlain extends EventDispatcher
	{
 
		private var model_:ModelClass;
		private var view_ :MainPlainView;
		private var host_ :DisplayObjectContainer;
 
		public function ControllerPlain(host:DisplayObjectContainer) 
		{
			model_ = new ModelClass();
			view_  = new MainPlainView();
			model_.addEventListener(ModelChange.MODEL, updateView);
			host_ = host;
		}
		public function renderView() {
			//добавление view в display list
			if (host_ && view_) {
				host_.addChild(view_);
			}
		}
		public function addObject(type:String, pt:MdlCordList, sz:MdlSizeList) {
			//метод добавления объекта, который будет непосредственно вызываться
			var newObject:RoomObject = new RoomObject();
			model_.addObject(newObject);
		}
		public function updateView () {
			//хенлдер события изменения модели			
			//по сути полная перерисовка view по словарю объектов
			for each(var object:RoomObject in model_.objs) {
				view_.renderObject(object.id);
			}
		}
 
	}
 
}
Надеюсь суть понятна.
Модель и контроллер я построил согласно описанию MVC, которое нашел на этом форуме.
Теперь вопрос

Мне необходимо, чтобы при перетаскивании изображения некоего предмета, менялись его координаты в модели, в словаре objs.
Если дальше писать событийную цепочку, получится так

Перетаскивание объекта в словаре View -> Событие изменения View -> Обработчик в Контроллере -> Изменение координат объекта в модели -> Событие изменения модели -> Обработчик в контроллере -> Изменение View...

Так вот, как лучше всего оборвать эту "цепочку"? Пока что я могу менять модель только с помощью view путем перетаскивания спрайтов.

То есть в идеале я хочу получить вот что

Перетаскивание объекта в словаре View -> Событие изменения View -> Обработчик в Контроллере -> Изменение координат в модели

Если же мне понадобится изменить сначала модель, а потом view (пока этого не требуется, но потребуется) мне нужна будет такая цепочка событий

Изменение координат объекта в модели -> Событие изменения модели -> Обработчик в контроллере -> Изменение объекта View

Как мне лучше всего дифференцировать события и методы для обработки разных типов взаимодействия view и модели ? В идеале я хочу получить возможно менять модель и view как от модели ко view, так и от view к модели.

И второй вопрос, это стоит ли апдейтить модель всю сразу при изменении 1 объекта?

Допустим у меня будет 100 объектов, а перетаскиваю я 1.
В базовом описании модели MVC апдейтится полностью модель, то есть по всем ее параметром она полностью перерисовывается.

Стоит ли написать методы, чтобы можно было апдейтить модель и view соответственно по одному, а не перерисовать весь словарь моих объектов RoomObject ?


Последний раз редактировалось braun3812; 09.10.2013 в 19:51. Причина: опечатка
Старый 09.10.2013, 20:30
cleptoman вне форума Посмотреть профиль Отправить личное сообщение для cleptoman Найти все сообщения от cleptoman
  № 2  
Ответить с цитированием
cleptoman
 
Аватар для cleptoman

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
не по теме: собственно, интересно наблюдать за метоморфозой форума - раньше самые рейтовые темы были про кнопки, теперь про МВЦ. растемс )
по теме: собственно эту тему уже тут обмусолили столько раз сколько те же пресловутые кнопки.
именно по этой теме: я понимаю желание понять и выстроить приложение по канонам МВЦ, но оно, в данном случае, "слегка" усложнено. хотя бы взять вашу главную модель: тут обычный хэш объектов вполне себе справится, а диспатчить изменения должны ваши RoomObject для конкретной своей подписавшийся на это вьюхе. действия пользователя через вью должны ловиться в контроллере, который принимает решение и меняет модель этой вьюхи, та поймав изменения от своей модельки меняет свое визуальное состояние.
ну, как то так.
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 09.10.2013, 20:32
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 3  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
model_ где вы такой синтаксис узрели при описании MVC?

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
а какое отношение конвенция имеет к сути вопроса? )
хотя , пожалуй , в этом отношении тоже следует подумать/почитать )
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 09.10.2013, 20:37
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 5  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Цитата:
Сообщение от cleptoman Посмотреть сообщение
не по теме: собственно, интересно наблюдать за метоморфозой форума - RoomObject для конкретной своей подписавшийся на это вьюхе. действия пользователя через вью должны ловиться в контроллере, который принимает решение и меняет модель этой вьюхи, та поймав изменения от своей модельки меняет свое визуальное состояние.
ну, как то так.
Я бы не спешил менять состояние модели сразу по вью. Как я понимаю предполагается какая-то мультиюзерная игра. Игнорировать действия других юзеров перед изменением модели как то непрально.

Старый 09.10.2013, 20:40
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 6  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
А что такое изменение модели если не запрос на сервер, ответ от которого меняет модель?
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 09.10.2013, 20:45
cleptoman вне форума Посмотреть профиль Отправить личное сообщение для cleptoman Найти все сообщения от cleptoman
  № 7  
Ответить с цитированием
cleptoman
 
Аватар для cleptoman

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
я же не знаю что там контроллер делает с моделями, но что-то в любом случае делает..буть-то оффлайн или онлайн приложение.
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 09.10.2013, 21:02
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 8  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Цитата:
Сообщение от Dukobpa3 Посмотреть сообщение
А что такое изменение модели если не запрос на сервер, ответ от которого меняет модель?
Ответ с сервера совсем не обязательно меняет модель. Если логика на клиенте, т.е. толстый клиент, то логика может разрешать update вида, а может не разрешать, и сама посылать реквесты на сервер.

Старый 09.10.2013, 21:07
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 9  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
да уж, уже больно смотреть темы про MVC
__________________
return this...

Старый 09.10.2013, 21:12
cleptoman вне форума Посмотреть профиль Отправить личное сообщение для cleptoman Найти все сообщения от cleptoman
  № 10  
Ответить с цитированием
cleptoman
 
Аватар для cleptoman

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
Цитата:
Ответ с сервера совсем не обязательно меняет модель. Если логика на клиенте, т.е. толстый клиент, то логика может разрешать update вида, а может не разрешать, и сама посылать реквесты на сервер.
а вам не кажется, что в модели данные не только по виду могут сидеть? ) потому по ответу логика меняет модель...если это видовые апдейты, то вид их получит..
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

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

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

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


 


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


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