Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Статьи (http://www.flasher.ru/forum/forumdisplay.php?f=101)
-   -   Хорошее MVC (http://www.flasher.ru/forum/showthread.php?t=138349)

Dukobpa3 02.01.2011 19:19

Цитата:

Сообщение от Kidd002 (Сообщение 961465)
То что ты хочешь сделать - это не простейший пример.

Имелся в виду простейший пример который не ограничивается какой-то парой тройкой триад, а уже что-то более похожее на полноценное приложение.

Цитата:

Сообщение от Kidd002 (Сообщение 961465)
По поводу описания:
Первое что бросается в глаза это то, что у тебя модель имеет какую-то декоративную функцию.

Ну для меня модель - это сугубо база данных.
Контроллер - AI, калькулятор. Вью - морда, а модель - БД. Для того чтобы узнать в каком месте рисоваться - вьюха спрашивает координаты у модели. Для того чтобы получить операнды для расчетов логики - контроллер спрашивает данные у модели.
Исходя из этого модель не имеет публичных методов (в том числе и протектед) а имеет только пачку геттеров-сеттеров. Контроллер видит и то и то, а вью только геттеры. Плюс в каждом сеттере висит dispathEvent("changed param #xxx") - который слышат все желающие, и все кто от этого зависят - подстраиваются. Например контролер поменял координаты башни, модель отмаячилась, а вьюха услышала об этом и перерисовалась.

Цитата:

Сообщение от Kidd002 (Сообщение 961465)
Зачем контроллеру хранить модель у себя? Пусть он поместит ее в модель уровня.

Принципиальной разницы не вижу. Ссылка на модель все-равно имеется. Если я помещу модель в модель уровня, то будет дублирование в некоторых моментах привносящее удобство, возможно.

Цитата:

Сообщение от Kidd002 (Сообщение 961465)
Затем на диаграммах показано что вьюшки не имеют ссылки на модель.

Я просто упустил эту ссылку дабы не усложнять схему. Но да, ссылка есть, как минимум вью должна слушать события модели, а так же иметь доступ к геттерам модели.

Цитата:

Сообщение от Kidd002 (Сообщение 961465)
Далее: вьюшки могут создавать не только контроллеры. Можно сделать так, чтобы вьюшка уровня слушала свою модель на предмет добавления/удаления моделей башен и сама добавляла/удаляла себе соответствующую вьюшку.

А вот это уже интересно, хотя как по мне - вносит некую путаницу в четкую систему, в которой контроллер решает всё. Хотя в пользу производительности наверное стоит на это идти в некоторых случаях.

Цитата:

Сообщение от Kidd002 (Сообщение 961465)
На второй диаграмме ты зачем-то дублируешь параметры moveable и size. Но ведь раз и контроллер, и представление имеют ссылки на модель, то они всегда могут получить эти параметры из нее.

Просто копипаста из первого варианта схемы. На параметры не обращайте внимания. Всё что там нужно было увидеть, это квадратики и наследование между класса "Mxx", "Vxx", "Cxx".

Цитата:

Сообщение от Kidd002 (Сообщение 961465)
В твоем случае главная вьюха действительно не нужна. Пусть ее роль выполняет главный класс.

Видимо да. А когда она будет нужна, в таком случае? Можно пример?

Цитата:

Сообщение от Kidd002 (Сообщение 961465)
Всплывающее окошко ни вьюха башни, ни вьюха уровня отображать не должны. Ты забыл об интерфейсе. И вьюха уровня, и всяческие панельки должны иметь определенного родителя. Вот он и должен это делать.

Хм. наверное таки да. Я упустил триаду окна.
будет наверное так в итоге:
- Триада окна
-- триада уровня
-- триада интерфейса
-- триада доп-элементов(возможно и без нее)

Цитата:

Сообщение от Kidd002 (Сообщение 961465)
Так пусть моделью хинта будет модель башни.

Это кстати да. Я так же упустил что можно клонировать нужные модели, или же вообще передавать существующие ссылки.

Спасибо за ответы.

Добавлено через 49 минут
помедитировал на "типовую схемку из википедии".

- Контролер содержит в себе модель и вью.
- вью содержит в себе модель.
- контроллер слушает вью.
- вью слушает модель.

т.е. касательно башни это будет выглядеть примерно так:
- V: "контроллер, Враг на горизонте"
- C: "вьюха, взять на прицел, заряжааай!!!"
- V: "Заряжаю"
- V: "Контроллер, Заряжено!"
- C: "Вьха, Огонь! Модель, у нас минус снаряд."

Вторая ситуация:
- V: "Ахренеть, нас враги атакуют"
- C: "Модель, делай минус 10 хп
- M: "Сделано, осталось 90%
- V: "Поняла, рисую анимацию потерпания от ударов".
......
- V: "Контроллер, они до сих пор атакауют"
- C: "Модель, делай минус 10 хп
- M: "Сделано, осталось 60%
- V: "Поняла, рисую анимацию пожара".
......
- V: "Контроллер, а они еще атакауют"
- C: "Модель, делай минус 10 хп
- M: "А хрен вам, овердамадж получили. Нету у нас больше хп"
- V: "Поняла, взрываемся. Контроллер, слышь, чувак, взорвались мы".
- C: "Товарищ Майор, мы взорвались"
- ParentC: "МодельУровня, делай минус башню. ВьюУровня - убери мусор"

//****************
Пральна я понимаю? Просто охота уже разобраться чтоб сразу и навсегда. Потому могу флудить глупыми вопросами.

terbooter 02.01.2011 23:04

А почему у вас вьюха определяет что ее бъют?

Добавлено через 10 минут
Применительно к вашему примеру игры жанра TD, я бы построил архитектуру так:
Есть модель (не один класс, а пакет), в которой все происходит, что должно происходить на экране,
только виртуально. То есть обновляются координаты врагов и наносится урон башням.
А вьюха (тоже не один класс =)) просто обновляет визуальное представление соответственно текущему состоянию модели.

Контроллеры вижу тут примерно такие:
- Юзер, что-то кликнул (строим башню, выходим в меню, пауза и тд)
- Обновление всей модели на единицу времени

И еще,
Цитата:

Контролер содержит в себе модель и вью
Не совсем верно говорить "содержит", тк это подразумевает агрегацию,
а у тут более общий случай - композиция.

Psycho Tiger 02.01.2011 23:20

Видимо я зря писал статьи про эмвэцэ. :(

terbooter 02.01.2011 23:26

Psycho Tiger, нет не зря. Стиль подхвачен верно =)
Цитата:

"А хрен вам, овердамадж получили. Нету у нас больше хп"

Dukobpa3 02.01.2011 23:56

Стиль не подхвачен, стиль в оригинале, так что попрошу;)

Цитата:

А почему у вас вьюха определяет что ее бъют?
Ок тогда вопрос. Кто это определяет?

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

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

//**********************
Путаница опять:) Получается в таком случае лучше не плодить кучу контролеров на каждую башню и каждого врага, а попытаться обойтись одним контролером уровня. А там он уже будет глядеть: "враг1 на расстоянии выстрела башни1. Отдать башне1 команду стрелять". А башни и враги будут просто суб-вьюхами одной большой вьюхи уровня. Модели же башен и врагов будут просто суб-моделями модели уровня(ну типа в модели уровня где-то массив башен, и массив врагов.)

Psycho Tiger 03.01.2011 00:01

Контроллер вертит моделями и определяет, были ли столкновения или нет. Заносит в модели инфу, если было столкновение.

Dukobpa3 03.01.2011 00:20

Походу вкурил.

У меня были шоры на тему того что триада должна быть триадой.
Ну а теперь Вывод таков: надо не бояться делать к примеру один контроллер на пачку вьюх и пачку моделей.
И в то же время одна вьюха может быть целой триадой.

Как-то так. Вроде теперь всё ясно. Спасибо. (ну если я со своими выводами ошибся, то готов продолжить дискуссию)

Psycho Tiger 03.01.2011 00:27

Ага, верно. Ровно как и вьюха может сосать 3-4 модели, так и один контроллер может отдавать приказы 3-4 вьюхам, так и контроллер может слушать 3-4 вьюхи, так и контроллер может менять 3-4 вьюхи.
Цитата:

И в то же время одна вьюха может быть целой триадой.
Триадой я бы её не назвал. Просто "компонент" для триады.

Dukobpa3 03.01.2011 00:43

Цитата:

Просто "компонент" для триады.
Хз. Попытался возразить да передумал. Тут чтоб дальше продолжать предметный разговор нужно уже конкретно архитектуру приложения рисовать. А это не один час работы.

Например тот же пример тавердефа.
Башня может быть просто вьюхой. а контроллер уровня уже будет всем рулить.
А можно этой вьюхе прикрутить контроллер минимальный какой-то. К примеру в его задачи будет входить оценивать расстояние до врагов, формировать массив врагов до которых может дострелить. Если какой-то враг попадает в область на расстоянии выстрела - внести в список. Если выходит из этого круга - удалить из списка. Ну и диспатчить выше моменты изменения списка.

Оценка расстояния это ведь логика, потому этому действию место в контроллере. Башне ведь проще прошерстить 9 клеток (3х3) и сделать свой маленький массив из, к примеру, 3-х мобов в области своей видимости, нежели контролеру уровня каждый кадр шерстить всё поле и делать перерасстановку сил из 10-и башен и 40-а врагов.
//********************

Короче суть ясна. А дальше уже под каждое конкретное приложение своя архитектура нужна.
//********************
А если так глобально, то мне импонирует данная система:)) Куда удобнее работать с 10-ю классами по 50 строк каждый чем с одним классом на 500 строк ;)

cr0w312 11.01.2011 07:42

Привет всем, тему не осилил(прочитал все, но в башке - каша), поэтому спрашиваю, контроллер(предположим игры) создает контроллер игрока, уровня и врага. Контроллер игрока в свою очередь создает модель игрока и вьюшку игрока, с уровнем и врагом - также, дальше что? модели ни про свои ни про чужие вьюшки не знают, расчет движения игрока/врага происходит в контроллере игры? Как устроить проверку столкновений? Или я путаю теплое с мягким?
ЗЫ. Код приводить не надо, тезисно.

Psycho Tiger 11.01.2011 13:35

Да, в контроллере.

etc 11.01.2011 15:22

Цитата:

Сообщение от cr0w312 (Сообщение 963506)
Привет всем, тему не осилил(прочитал все, но в башке - каша), поэтому спрашиваю, контроллер(предположим игры) создает контроллер игрока, уровня и врага. Контроллер игрока в свою очередь создает модель игрока и вьюшку игрока, с уровнем и врагом - также, дальше что? модели ни про свои ни про чужие вьюшки не знают, расчет движения игрока/врага происходит в контроллере игры? Как устроить проверку столкновений? Или я путаю теплое с мягким?
ЗЫ. Код приводить не надо, тезисно.

Контроллер игрока модель игрока не создает.

Хомяк 11.01.2011 21:31

Размер топика уже превосходит здравые границы. В топике повторяются вопросы и ответы. Потому, что каждому вновь спрашивающему не осилить уже всё написанное ранее, проще еще раз спросить.

cr0w312 22.01.2011 22:30

Как будет выглядеть MVC для проекта на Papervision3D?

Zebestov 22.01.2011 22:42

Я не большой мастак, но подозреваю, что MVC в Papervision3D и ему подобных самое последнее, о чем стоит заботиться. Там приоритет №1 — скорость, а не элегантность.

cr0w312 23.01.2011 03:18

ясно, тогда другой вопрос - насколько сильно упадет скорость приложения, при использовании MVC?
Возьмем например гамес уровня TD и ТаймЗэро.

Zebestov 23.01.2011 03:28

Ну это разговор ни о чем. Игры уровня TD никак не пострадают от использования MVC. Как вообще в данном случае можно сравнивать 3d движок и казуальную игру?

etc 23.01.2011 13:28

Цитата:

Сообщение от cr0w312 (Сообщение 967003)
Возьмем например гамес уровня TD и ТаймЗэро.

Без MVC TimeZero валила бы Core i7 на раз-два.

Котяра 23.01.2011 17:29

Я бы сказал по другому: без mvc, чтобы TimeZero не валила бы Core i7 на раз-два, пришлось бы приложить гораздо больше усилий, и не факт что получилось бы так же хорошо.

Psycho Tiger 23.01.2011 19:21

Цитата:

Сообщение от etc (Сообщение 967049)
Без MVC TimeZero валила бы Core i7 на раз-два.

MVC для скорости? Всегда видел в нём небольшой упадок в ней в угоду сильно возрастающему удобству разработки.
Расскажи пожалуйста за счет чего, по твоему мнению, из за MVC появляется megaboost в скорости?

Dukobpa3 24.01.2011 09:56

Цитата:

Всегда видел в нём небольшой упадок в ней в угоду сильно возрастающему удобству разработки.
Как по мне - внятная архитектура и есть залогом производительности. А как ты сам несколько раз повторял в своих постах - МВЦ у всех разный;)

Psycho Tiger 24.01.2011 13:46

Поменять текущее имя игрока:
1) Кривоархитектура с логикой и отображение в одном классе:
1.1) Поменять поле класса
2.2) Обновить новое значение визуально

2) MVC:
2.1) Диспатч события об изменении
2.2) Поймали событие, меняем модель
2.3) Поменяли модель, рассылаем событие
2.4) Ловим событие, обновляем отображение

На фоне общей картины это микроны, но отчего MVC даёт производительность я не понимаю. Только удобство, имхо.

Dukobpa3 24.01.2011 21:02

скорее не так:)) Твой пример на подгонку фактов похож уж слишком)

Поменять текущее имя игрока:

1) MVC:
1.1) Диспатч события об изменении
1.2) Поймали событие, меняем модель
1.3) Поменяли модель, рассылаем событие
1.4) Ловим событие, обновляем отображение

2) Кривоархитектура с логикой и отображение в одном классе:
2.1) Диспатч события об изменении (ввели в поле, нажали ок)
2.2) Поймали событие
2.3) Выполнили с десяток непонятных действий, объяняемых тем что архитектура писалась кучей программистов
2.4) И еще десяток действий
2.4.хх) Не забываем что в процессе написания поправили я пяток-другой классов чтоб предыдущие пункты выполнялись.
2.5) теперь у нас есть переменная с именем новым (и старым)
2.6) для верности продублировали в десяток переменных
2.7) послали в базу данных
2.8) оно до базы не дошло (почему-то О_о)
2.9) поправили еще с пяток классов
....................
Ну и в таком духе. Так и блуждет наше нажатие на кнопку "Ок" при смене Никнейма по всей системе, плодя за собой еще целые кучи событий и кучи переменных....

Psycho Tiger 24.01.2011 22:28

Ещё до начала пользования MVC код у меня был более-менее, так что не разделяю :)

cr0w312 25.01.2011 02:23

Вот я кретин - у Мука зоопарк был построен на MVC - пойду перечитаю...

etc 25.01.2011 10:38

Цитата:

Сообщение от Psycho Tiger (Сообщение 967140)
MVC для скорости? Всегда видел в нём небольшой упадок в ней в угоду сильно возрастающему удобству разработки.
Расскажи пожалуйста за счет чего, по твоему мнению, из за MVC появляется megaboost в скорости?

В централизации событий. Не нужно бегать по всем контролам и обновлять данные. Нет посредников в операции обновления.

Psycho Tiger 25.01.2011 12:45

Спасиб.

cr0w312 01.03.2011 16:47

Цитата:

Сообщение от Psycho Tiger (Сообщение 898413)
Цель MVC - отделить то, что на экране от того, что происходит логикой. Короче, если проект расчитывался как консольный, а потом вдруг трах тибидох и хотим 3д - надо будет менять лишь вьюшку.

если в контроллере происходит расчет коллизий, а мы вдруг трах тибидох и 3d, контроллер тоже надо будет менять, так как в расчете столкновений появляется z координата, и модель наверно тоже надо будет дополнить?
если я туплю не пинайте сильно, модель может состоять из 5-7 классов?

Bgg 01.03.2011 16:58

Цитата:

Сообщение от cr0w312 (Сообщение 977267)
если в контроллере происходит расчет коллизий, а мы вдруг трах тибидох и 3d, контроллер тоже надо будет менять, так как в расчете столкновений появляется z координата, и модель наверно тоже надо будет дополнить?
если я туплю не пинайте сильно, модель может состоять из 5-7 классов?

Столкновения визуальных объектов должен рассчитывать View, и результат(столкнулся/не столкнулся) отдавать контроллеру.

terbooter 01.03.2011 17:10

Цитата:

Сообщение от Bgg (Сообщение 977271)
Столкновения визуальных объектов должен рассчитывать View, и результат(столкнулся/не столкнулся) отдавать контроллеру.

Очень спорное утверждение

cr0w312 01.03.2011 17:16

Цитата:

Сообщение от Bgg (Сообщение 977271)
Столкновения визуальных объектов должен рассчитывать View, и результат(столкнулся/не столкнулся) отдавать контроллеру.

у меня 10 вьюшек которые ничего друг о друге не знают. у них есть модели, а у контроллера есть и модели и вьюхи

Psycho Tiger 01.03.2011 17:29

Цитата:

Сообщение от Bgg (Сообщение 977271)
Столкновения визуальных объектов должен рассчитывать View, и результат(столкнулся/не столкнулся) отдавать контроллеру.

Минус. Столкновение — это логика.

etc 01.03.2011 17:31

Цитата:

Сообщение от Psycho Tiger (Сообщение 977280)
Минус. Столкновение — это логика.

И где оно тогда будет рассчитываться?

terbooter 01.03.2011 18:14

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

Если используется hitTest (уже про 2D), то можно и во вьюхе. Но, имхо, лучше тоже в контроллере.

cr0w312 01.03.2011 18:35

Цитата:

Сообщение от terbooter (Сообщение 977294)
надо смотреть на конкретный случай, что это за объекты.

vHuman расширяет DisplayObject3D - это papervision3d.

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

etc 01.03.2011 18:40

Цитата:

Сообщение от terbooter (Сообщение 977294)
Но, имхо, лучше тоже в контроллере.

По таймерам и enterFrame-ам?

Psycho Tiger 01.03.2011 18:58

Цитата:

Сообщение от etc (Сообщение 977282)
И где оно тогда будет рассчитываться?

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

etc 01.03.2011 19:03

Цитата:

Сообщение от Psycho Tiger (Сообщение 977306)
Получается, что вьюха сама двигает объекты, не читая данные из модели (т.к. писать в модель она не может по определению).

Вьюха только сообщает, что произошёл хиттест вот этого и вот этого. Что с этим делать — решает контроллер.
Но оперировать с display-объектами контроллер не должен.

Psycho Tiger 01.03.2011 19:24

Цитата:

Сообщение от etc (Сообщение 977310)
Вьюха только сообщает, что произошёл хиттест вот этого и вот этого. Что с этим делать — решает контроллер.
Но оперировать с display-объектами контроллер не должен.

Спорно. Может действительно удобней. Удаляюсь думать.

@etc, bgg, спасибо.

cr0w312 01.03.2011 19:30

Цитата:

Сообщение от etc (Сообщение 977310)
Вьюха только сообщает, что произошёл хиттест вот этого и вот этого. Что с этим делать — решает контроллер.
Но оперировать с display-объектами контроллер не должен.

ок, возьмем 2d, передвигается мувик, допустим автомобиль, на пути следования автомобиля стоит столб(другой мувик). Контроллер получает событие от клавы, что машинка должна двигаться вперед, и меняет модельАвто.х и модельАвто.у, вьюхаАвто, услышав изменение модели - передвигается в новые координаты. как вьюхаАвто узнает, что влупилась в столб?


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

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