![]() |
|
||||||||||
|
|||||
|
Здравствуйте.
Решил попробывать написать проект и использованием MVC-модели. Если я все правильно понял, Модель - это хранилище данных, ссылки которые раздаются вьюверам. Вьюверы в свою очередь обновляют данные когда изменились данные в модели. Контроллер - это механизм который создает вьюверы, модели, а так же осуществляет создание связей между ними. Знаю что глобальный класс должен передавать в главный контроллер ссылку на себя и все но у меня пока немного не так. Пока создаю модель без вьюверов, хочу пройти сначало по моделям с контроллерами. основной класс 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(); } } } 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(); } } } 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)); } } } P.s. Силой святого компилятора призываю к обсуждению Babylon =)
__________________
return this... Последний раз редактировалось AlexCooper; 20.07.2013 в 15:20. |
|
|||||
|
Регистрация: Jan 2013
Сообщений: 126
|
Цитата:
Контроллер имеет ссылку на Модель. Модель имеет только на Вьювер. Вьювер имеет на Модель и на Контроллер. |
|
|||||
|
хм... а в чем же тогда смысл модели? Если вьювер делает какие-то расчеты ( в нем присутствует какая-либо логика) . Вьювер вообще по сути на сколько я понял может меняться как перчатки, так же как и модель, и за все это ни как в Бригаде, отвечает только контроллер. То-есть контроллер выступает механикой приложения, вьювер только отображением ( максимум генерация событий ) а модель хранение данных для get вьювера и set контроллера.
__________________
return this... |
|
|||||
|
Цитата:
__________________
return this... |
|
|||||
|
Модель это не просто хранилище данных, модель - это состояние программы, которое вполне может изменяться и самостоятельно (действие гравитации в игре, нанесение урона юнитам стоящим в огненной луже, изменение индексов на онлайн бирже)
Модель описывает всю логику программы, высылает уведомления при возникновении некоторых событий. Модель имеет интерфейс для чтения/внесения изменений в свой мирок. Модель ничего не знает ни про визуализатор, ни про контроллер. Визуализатор - подключаемый модуль для отображения модели. Он имеет ссылку на модель. Визуализаторов может быть несколько, они могут быть разными (2д, 3д) и все они сразу могут отображать одну модель. Визуализатор читает модель, слушает её события изменения, обновляет себя сам в соответствий с текущей ситуацией в отображаемой им модели. Визуализатор слушает действия пользователя и высылает их события. Вьювер так-же имеет некоторый интерфейс, он может быть заморожен контроллером при выполнении какой-то операций. Контроллер имеет ссылки на оба компонента. Он приостанавливает ход выполнения в модели, добавляет новых игроков на бирже, активирует дополнительные режимы. Контроллер слушает визуализатор на предмет действия пользователя, анализирует и принимает решения по изменению модели. Имхо, на истину не претендую, так делаю сам.
__________________
Дети не должны знать о своих родителях Последний раз редактировалось Tails; 20.07.2013 в 16:30. |
|
|||||
|
Спасибо Tails, доходчиво написано.
То-есть по сути, модель это и есть модель со всеми вытекающими ему свойствами, может сама видоизменяться но не участвует на прямую с внешними процессами, за это отвечает контроллер. Но остается открытым мой вопрос, контроллер получил событие создать новый контроллер, каким образом он это делает?
__________________
return this... |
|
|||||
|
Есть глобальная модель, для описания всех необходимых данных в своём мире, она может создавать дополнительные под-модели. Аналогично и для вьюшки с контроллером.
Вы в главном коде единожды создаёте глобальные: модель, вьювер и контроллер, а те уже сами по ходу выполнения решают, что им нужно. Главный контроллер может создать дополнительные под-контроллеры для сохранения/загрузки файла, вьювер может создавать дополнительные под-вьюверы для отображения бэграунда/юнитов и т.д. пс. Выше стоящий контроллер должен принимать решение о смене своих детей - под-контроллеров.
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Я для себя использовал иерархический MVC, То есть у меня не было обособленных трио, у меня были контроллеры с некоторым уровнем вложенности, в главном контроллере были созданы вьюшки во вьюшках; были созданы в нем же модели в моделях. То есть каждой вьюшке передаем либо какую-то модель в главной модели, либо всю модель целиком.
Добавлено через 44 секунды Словом, выбирайте то, что вам будет удобнее. Эта штука у каждого разработчика своя.
__________________
тут я |
|
|||||
|
Понял. Буду пробывать)
То-есть примерно так 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)); } } } Хочется быть в тренде, что-бы не смотрели на мои разработки и думали кто написал этот *****код.
__________________
return this... |
![]() |
![]() |
Часовой пояс GMT +4, время: 23:35. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|