![]() |
Вопрос про MVC
Всем здравствуйте. Сейчас изучаю MVC шаблон (парадигму) и столкнулся с некоторым не понимаем.
Вопрос №1: Допустим в главной модели (GlobalModel) есть ещё 2 (CharacterModel, LocationModel). И изменилась одна из под-моделей. Как правильно осуществить диспетчеризацию? - в каждую под-модель передавать GlobalModel и из неё вызывать диспетчерезацию? - или делать bubble (но это не удобно) Вопрос №2: Как правильно диспетчирезировать события изменения модели? - использовать только одно событие "Event.CHANGE" или создавать для этого свои классы событий |
Если не используете специализированных фреймворков:
1) Как вам удобнее. Разве не контроллер должен дергать вьюхи, рассказывая, что изменилась моделька? Модель же изменяется контроллером? 2) Как вам удобнее. |
Цитата:
Добавлено через 2 минуты Хотя я наверно не правильно понял Ваши слова. Когда я прочел Ваши слова, то в голове нарисовалась картинка из слов сказанных не Вами, но гласящих, что контроллер включает нужную вью. Добавлено через 2 минуты Вы случаем не об этом?) |
1 - пусть каждый вью слушает свою модель..не обязательно таскать все модели на все случаи жизни в одной главной модели...одна (главная модель) просто фигурирует в большинстве примеров описывающих классическое мэвэвцэ.
2 в вашем случае контроллер может сказать модели сколько у нее осталось жизней..вьюха слушает изменение ХП из модели и сама принимает решение сколько лампочек ей зажечь. |
Цитата:
Но у меня в голове контроллер связывает данные и вьюхи. Соответственно следит, что модель изменилась и говорит вьюхам - отобразите. Ну и сам конечно меняет модель (данными с сервера, например). Конечно бывают исключения, когда из вьюхи быстрее узнать, что модель изменилась. Короче я не за строгое соблюдение парадигм (и табу хехе). То есть, если робота ударили, то об этом узнает контроллер, он пишет в модель новое состояние, и говорит аватару робота - обнови инфу из модели. |
Правильно ли я понимаю, что код вроде этого, должен находиться в модели:
Код AS3:
Код AS3:
|
Цитата:
|
ну это мы можем щас тут раздуть много всего. и про декораторы для лампочек и про медиаторы и прочее..
атвору - суть проста: вьюха - стостоит из трех лампочек ,имеет ссылку на моедль и слушает ее изменение..самостоятельно принимает решение сколько чего и как отобразить в зависимости от изменениях в модели. контроллер имеет ссылки на модель и вьюху (с последней работает напрямую исходя из контекста употребления и здравого смысла). слушает интерактиыне события вьюхи и меняет модель. это как на картинках...в жизни все может быть несколько сложней |
Цитата:
|
Цитата:
|
Цитата:
Но я как малоопытный возьму на себя все тяжкую ношу ответа, а уж пусть опытные меня критикуют, так будет легче диалог наладить))) Во первых - есть много всяких mvc и это не только чьё-то личное предпочтение, это уже от вида приложения зависит. Если Вы делаете чисто akti приложение, то это одно mvc - назовем его нубское, так как все фигуранты помещены во вью, чем и является flash по своей сути. Лично я при такой схеме делаю главную вью, главную модель и главный контроллер. И вот главная модель, где заключена логика приложения, диспатчит событие, что нужно переключить вью одной локации на другую. Главная вью лезет в модель и берет ссылку на модель и передает её во вью-чилд при создании. И так далее. А второй вариант, это когда flash это вью, модель сервер... И тут уже не работает стандартная модель, так как появляются медиаторы и маленькие контроллеры, а модели ( не серверная ) собираются на лету в специальном месте и передаются там же во вью взятым из фабрик. И все это делается по заранее написанным конфигам и так далее... |
Продумайте и постройте сначала архитектуру приложения, а уже потом пишите код. Я обычно проектирую записывая ее в виде XML файла, но JSON лучше при реализации. Затем Вы траверсите JSON, связывайте ноды моделей с классами вью или контроллеров, в контроллерах происходит коммуникация между отдельными компонентами MVC, посредством передачи своей ноды данных . Разумно сразу продумывать всё на парадигме интерфейсов и фабрик. Это минимизирует структуру и сам код. Используйте общий объект глобально доступный для всех частей вашего MVC, что-то типа $scope в AngularJS.
|
небольшой оффтоп. С утра, перечитав, понял, что обязан извиниться за опечатки )
|
Цитата:
|
Тема жевана-пережевана. svdsLis, вы можете сделать как вам нравиться, но эмпирическим путём доказано, что в большинстве случаев, вьюшке удобнее слушать изменения модели. Представьте, что вам нужно отображать некую величину в текстовом, индикаторном (например, линейка здоровья) и графическом (вид зависит от значения величины) виде? Вместо того, чтобы контроллеру вызывать цепочки методов дочерних контроллеров, каждому виду лучше подписаться на события модели и обновляться.
1 - лучше сделать бабл. Бабл - удобно. 2 - пишите свои события. Если ваша модель имеет много изменяемых свойств, то удобнее диспатчить изменения отдельного свойства. |
Cybo, может тема и пережевана, но каждым по-своему. Поэтому имеет смысл прожевать ещё.
Цитата:
|
Babylon++
Цитата:
Добавлено через 56 секунд Цитата:
|
Код AS3:
|
Какие у модели события?
|
Цитата:
Или: Цитата:
Цитата:
|
Цитата:
|
Если модель меняется в контроллере, то по завершении изменения значения модели вьюшке передается измененное значение. Событие об изменении значения модели посылает обработчик из контроллера виду и вид меняется. А если модель подписана на события вьюшки, а вьюшка на события модели, то и контроллер не нужен.
|
Babylon, классическую картинку про устройство MVC вообще никогда не видел что ли?
|
Бабилон, у вас каша, пардон..модель не слушает вьюшку...вьюшку слушает контроллер (в интерактивной части) и меняет модель..если контроллер меняет сам вьюшку по завершению изменения модели, то вам модель не нужна, следуя вашей же логике. скажу больше - не всегда эту самую модель меняет один контроллер. существуют всякие под контроллеры которые меняют разные части модели. процессоры, команды, поведенческие всякие стейты..и им не нужна всем вьюшка , которую они будут менять..они меняют состояние, а именно модель...а разные вьюхи ждут изменения модели ввиде событий от нее и обновляются..сами..в контексте заложенной в них логики отображения.
|
Неча на модель пенять, коли руки кривы :)))
|
Лучше даже не говорить так: контроллер меняет модель. Строго говоря, модель — логическое ядро приложения, оно само там кипит/бурлит/меняется, о чем мы, как все уже понимают, узнаем из посылаемых событий и из всяких геттеров. Контроллер же просто дергает предоставленные моделью методы, через которые модель таким образом узнает, что там происходит в мире: може кто кнопочку "стрелять" нажал, или данные откуда-то с сервера прилетели, и т.д.
|
вот еще один кандидат в еретики )
|
Babylon, да, Вы все напутали. Контроллер вправе менять вью и модель напрямую. Вью меняется от событий модели. Вью сообщает событиями контроллеру о своих интерактивностях.
Кстати, ребятки, никто из вас так и не сказал, что есть толстый контроллер, а есть тонкий. В толстом обработка данных в большинстве случаев идет прямиком в контроллере, в модель записываются данные по окончанию обработки. А в тонком необработанные данные передаются моделям и они сами шурукают все данные как нужно. |
Zebestov я правильно понимаю, что в Вашем крайнем посте модель - это логика, вынесенная из контроллера. Я просто не сильно понимаю, зачем выносить её события из контроллера, если он есть? Пусть логика в нем и будет, а данные будут в виде пассивной модели.
cleptoman, чтобы вьюхи "сами" обновлялись в них должны быть хэндлеры, ловящие кастомные события. Но мы же не про вьюхи говорим. Добавлено через 1 минуту КорДум, я про это же и говорю. |
Babylon, Вы говорите о том же, но только продвигаете самый не рекомендуемый вариант.
Который наверняка переняли из js. |
естественно, чтобы вьюхи ловили события МОДЕЛИ в них должны быть хендлеры событий МОДЕЛИ.
|
Gerbert, что плохого в коммандере, находящимся в контроллере, событийно управлющим вьюшкой?
|
А зачем тогда модель? Даже описание с вики, которое гласит, что подход с пассивной моделью плох из-за того,
что web разработчики используют БД, как хранилище и БД === модель... Это полная фигня, так как я не понимаю, какое отношение хранилище имеет к модели. При жирном контроллере модель вообще не нужна, но это и не говорит, что в классическом варианте нет нужды в контролере. Хоть гоф и опустил в своих толкованиях контроллер ( чем запустил развитие паранойи у большинства программистов ), он все же очень нужен и его обязанности нельзя разделить между видом и моделью. В варианте с тонким контроллером царит наибольшая эдилия с точки зрения ООП. Это мне так кажется. Добавлено через 52 секунды Или Вы говорите о сервисах, которые выполняются в контроллере? |
Герберт, я именно об этом и говорю, про жирный контроллер, и данные попадают в него из сервиса. Плюс в том, что логику можно подстраивать, на основе из этих данных непосредственно в контроллере. То есть в контроллере много всяких команд, и вы исходя из тасков вашего приложения пользуйтесь теми которые вам нужны.
|
Babylon, да понимаю о чем Вы, но во flash наверное об этом боятся говорить и это и является, как Вы уже заметили, неохотно и мало обсужденным. В js нет модели, в angular нет моделей, там есть только вид и все с ним связанное, но для простаты ( или из-за скудной фантазии ) там есть вью-моделm, которые называются модель? хотя модель это сервер и в js её существование невозможно.
В клиент-серверном приложении flash же тоже только представление и в таком контексте его можно сравнивать с js, но когда говорят о mvc, то говорят о настольной версии, где flash-представление представляется полноценным mvc подгруппами. |
Изучая TypeScript я пришел к простому выводу, что классы нужны в основном для создания интерфейсов. Всё остальное это объект и его schema.
|
эка вы типизацию витиевато обозвали.
|
Цитата:
|
Цитата:
|
В моем понятии, моделью называют то, что содержит логику приложения и находится на сервере.
Js к серверу отношения не имеет ( nodejs не в счет ) и является представлением. И вот у меня мысли разбегаются, когда говорят, что в js есть модель... Сервер засунули в представление.. Как? |
| Часовой пояс GMT +4, время: 03:56. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.