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

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

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

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

Здравствуйте.
Решил попробывать написать проект и использованием MVC-модели. Если я все правильно понял, Модель - это хранилище данных, ссылки которые раздаются вьюверам.
Вьюверы в свою очередь обновляют данные когда изменились данные в модели.
Контроллер - это механизм который создает вьюверы, модели, а так же осуществляет создание связей между ними.

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

основной класс
Код AS3:
package  {
 
	import flash.display.Sprite;
 
	import me.inpictures.worker.Framework;
	import me.inpictures.worker.Auth;
	import me.inpictures.worker.amf.AMF
 
	public class InPictures extends Sprite {
 
		private var framework:Framework = new Framework();
 
		public function InPictures() {
 
			new AMF('http://dev.net/app/Amfphp/');
 
			framework.addTask(new Auth());
			framework.run();
		}
	}
}
framework
Код AS3:
package me.inpictures.worker {
 
	import flash.events.Event;
 
	public class Framework {
 
		private var _autorun:Boolean;
 
		private var _task:Vector.<Worker>;
 
		public function Framework(autorun:Boolean = true) {
 
			_autorun = autorun;
 
			_task = new Vector.<Worker>; 
		}
 
		public function addTask(worker:Worker):void {
			_task.push(worker);
		}
 
		public function run():void {
 
			if (_task.length) {
 
				var task:Worker = _task.pop();
					task.addEventListener(Event.COMPLETE, taskCompleteHandler );
					task.run();
			} else trace('Framework: TaskComplete');
		}
 
		private function taskCompleteHandler(event:Event):void {
 
			event.currentTarget.removeEventListener(Event.COMPLETE, taskCompleteHandler );
 
			if (_autorun) run();
		}
	}
}
Вот здесь возникает первый вопрос. При выполнении контроллера Auth у нас приходят данные от сервера, и если в данных содержится переменная "registration" значит нужно провести регистрацию пользователя, то-есть запустить отдельный контроллер. Как это правильно реализовать? Создать модель на подобии "центральной" модели приложения, где при выполнении контроллера Auth, модель приложения изменит к примеру статус и в соответствии главный контроллер удалит / создаст нужны окна или же мы из одного контроллера вызываем сразу второй? И в любом из случаев каким образом передаем нужный нам контроллер (экземпляр / константа + if ) ?
Код AS3:
package me.inpictures.worker {
 
	import flash.events.Event;
 
	import me.inpictures.data.User;
 
	import me.inpictures.worker.amf.AMF;
 
	public class Auth extends Worker {
 
		public function Auth() {
 
		}
 
		override public function run():void {
 
			AMF.call('User/auth', authHandler, User.simple );
		}
 
		private function authHandler(data:Object):void {
 
			if (data.registration) {
 
				trace('registration');
			}
 
			dispatchEvent(new Event(Event.COMPLETE));
		}
	}
 
}
Добавлено через 26 минут
P.s. Силой святого компилятора призываю к обсуждению Babylon =)
__________________
return this...


Последний раз редактировалось AlexCooper; 20.07.2013 в 15:20.
Старый 20.07.2013, 15:28
namespaces вне форума Посмотреть профиль Отправить личное сообщение для namespaces Найти все сообщения от namespaces
  № 2  
Ответить с цитированием
namespaces
 
Аватар для namespaces

Регистрация: Jan 2013
Сообщений: 126
Цитата:
Сообщение от AlexCooper Посмотреть сообщение
Если я все правильно понял, Модель - это хранилище данных, ссылки которые раздаются вьюверам.
Вьюверы в свою очередь обновляют данные когда изменились данные в модели.
Контроллер - это механизм который создает вьюверы, модели, а так же осуществляет создание связей между ними.
Вьюверы также информируют Модель об изменении, обратная ссылка на Модель, чтобы Контроллер знал когда изменился Вьювер.

Контроллер имеет ссылку на Модель.
Модель имеет только на Вьювер.
Вьювер имеет на Модель и на Контроллер.

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от namespaces Посмотреть сообщение
Вьюверы также информируют Модель об изменении, обратная ссылка на Модель, чтобы Контроллер знал когда изменился Вьювер.

Контроллер имеет ссылку на Модель.
Модель имеет только на Вьювер.
Вьювер имеет на Модель и на Контроллер.
хм... а в чем же тогда смысл модели? Если вьювер делает какие-то расчеты ( в нем присутствует какая-либо логика) . Вьювер вообще по сути на сколько я понял может меняться как перчатки, так же как и модель, и за все это ни как в Бригаде, отвечает только контроллер. То-есть контроллер выступает механикой приложения, вьювер только отображением ( максимум генерация событий ) а модель хранение данных для get вьювера и set контроллера.
__________________
return this...

Старый 20.07.2013, 15:49
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
Вьюверы также информируют Модель об изменении, обратная ссылка на Модель, чтобы Контроллер знал когда изменился Вьювер.
Неправда. Вьюверы диспатчат события, эти события ловят контроллеры.

2ТС, прочтите это.
__________________
тут я

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от КорДум Посмотреть сообщение
Неправда. Вьюверы диспатчат события, эти события ловят контроллеры.

2ТС, прочтите это.
Благодарю, я это уже читал ( изучал вопрос прежде чем приступить к разработке) . Только там слишком много различных мнений, но выбрал то что и пытаюсь сейчас реализовать. Вопрос пока что стоит только в том, как из одного контроллера создавать другой. Передавать данные через модель ( и каким образом const+if или экземпляром) или создавать контроллер в контролере передавая ему нужные ссылки.
__________________
return this...

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Модель это не просто хранилище данных, модель - это состояние программы, которое вполне может изменяться и самостоятельно (действие гравитации в игре, нанесение урона юнитам стоящим в огненной луже, изменение индексов на онлайн бирже)

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

Визуализатор - подключаемый модуль для отображения модели. Он имеет ссылку на модель. Визуализаторов может быть несколько, они могут быть разными (2д, 3д) и все они сразу могут отображать одну модель. Визуализатор читает модель, слушает её события изменения, обновляет себя сам в соответствий с текущей ситуацией в отображаемой им модели. Визуализатор слушает действия пользователя и высылает их события.
Вьювер так-же имеет некоторый интерфейс, он может быть заморожен контроллером при выполнении какой-то операций.

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

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


Последний раз редактировалось Tails; 20.07.2013 в 16:30.
Старый 20.07.2013, 16:10
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 7  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Спасибо Tails, доходчиво написано.
То-есть по сути, модель это и есть модель со всеми вытекающими ему свойствами, может сама видоизменяться но не участвует на прямую с внешними процессами, за это отвечает контроллер.

Но остается открытым мой вопрос, контроллер получил событие создать новый контроллер, каким образом он это делает?
__________________
return this...

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Есть глобальная модель, для описания всех необходимых данных в своём мире, она может создавать дополнительные под-модели. Аналогично и для вьюшки с контроллером.

Вы в главном коде единожды создаёте глобальные: модель, вьювер и контроллер, а те уже сами по ходу выполнения решают, что им нужно. Главный контроллер может создать дополнительные под-контроллеры для сохранения/загрузки файла, вьювер может создавать дополнительные под-вьюверы для отображения бэграунда/юнитов и т.д.

пс. Выше стоящий контроллер должен принимать решение о смене своих детей - под-контроллеров.
__________________
Дети не должны знать о своих родителях

Старый 20.07.2013, 16:22
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 9  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Я для себя использовал иерархический MVC, То есть у меня не было обособленных трио, у меня были контроллеры с некоторым уровнем вложенности, в главном контроллере были созданы вьюшки во вьюшках; были созданы в нем же модели в моделях. То есть каждой вьюшке передаем либо какую-то модель в главной модели, либо всю модель целиком.

Добавлено через 44 секунды
Словом, выбирайте то, что вам будет удобнее. Эта штука у каждого разработчика своя.
__________________
тут я

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Понял. Буду пробывать)
То-есть примерно так
Код AS3:
package me.inpictures.worker {
 
	import flash.events.Event;
 
	import me.inpictures.data.User;
 
	import me.inpictures.worker.amf.AMF;
 
	public class Auth extends Worker {
 
		private var _model:Model;
 
		public function Auth(model:Model) {
			_model = model; // Ссылка на главную модель 
		}
 
		override public function run():void {
 
			AMF.call('User/auth', authHandler, User.simple );
		}
 
		private function authHandler(data:Object):void {
 
			if (data.registration) {
 
				// меняем в главной моделе страницу
				_model.setPage('registration'); 
				// или нужно использовать константу, если да то как?
			}
 
			dispatchEvent(new Event(Event.COMPLETE));
		}
	}
 
}
Добавлено через 1 минуту
Цитата:
Сообщение от КорДум Посмотреть сообщение
Эта штука у каждого разработчика своя.
Хочется быть в тренде, что-бы не смотрели на мои разработки и думали кто написал этот *****код.
__________________
return this...

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

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

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


 


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


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