Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Отделение логики от отображения. (http://www.flasher.ru/forum/showthread.php?t=180204)

PlutDem 30.05.2012 01:17

Отделение логики от отображения.
 
Здравствуйте, задумал сделать независимый класс World и класс View отвечающий за отображение его содержимого. Ко всему прочему, в целях экономии ресурсов и облегчения возможного последующего портирования на другие языки, мною было принято решение отказаться от использования AS3 событий в классе World. Все шло просто прекрасно, но я столкнулся с затруднениями пытаясь заставить класс View реагировать на происходящее в World. Содержимое World представлено объектами, хранящимися в массиве, View на основе этого массива создает для каждого объекта World DO и помещает его на сцену. Не понятно только как сделать, что бы при добавлении/удалении из массива World объектов View узнавал об этом и соответственно добавлял и удалял со сцены необходимые DO. Очень не хочется заставлять World заботиться о нуждах кого бы то ни было. Есть ли у кого нибудь соображения на этот счет?

strangedk 30.05.2012 01:28

Чем-то мне ваш метод напоминает шаблон Facade, синглтон что-ли?

Цитата:

Не понятно только как сделать, что бы при добавлении/удалении из массива World объектов View узнавал об этом
Зря вы отказались от событий, было бы проще и красивее.

Вы можете сделать во view какой-нибудь setter, в который будете пихать свой массив при обновлении.
Соответственно view должен на это реагировать перерисовкой

Wolsh 30.05.2012 01:34

MVC-то чем не пришелся?)))

strangedk 30.05.2012 01:39

тоже думал спросить, чем фреймверки не подошли.

Но раз человек даже от событий отказывается, то куда тут уж фреймверки :)

Zebestov 30.05.2012 01:46

strangedk, подозреваю, что Wolsh говорил не фреймворке.

Партизан 30.05.2012 01:48

Странно, что вы именно EventDispatcher выбрали как осложнение для портирования на другие языки, реализация этого класса на других языках не такая уж и трудоемкая задача по сути. Ничего в нем магического вроде нет.

semenyakinVS 30.05.2012 03:43

NSNotificationCenter
 
В принципе, если вам нужно своё решение, можете использовать самописный аналог эплового (NSNotificationCenter). Через него можно диспачить что угодно, в том числе изменение представления и модели.

Если нужно - есть моя реализация этой штуки на джаве, переделаете с минимальными изменениями.

PlutDem 10.06.2012 22:26

Решил все же оставить события. Логика диспатчит, а отображение слушает. Потеря производительности - минимальная, удобство - максимальное:) Хотя, необходимость добавлять в код логики, код для отображения все равно огорчает.
Столкнулся с другой проблемой:
View помещает на сцену DO в зависимости от типа объектов в World Т.е. нужно как то отличать мяч от коробки и подгружать для каждого объекта соответствующее ему изображение. Может ли кто нибудь предложить, что нибудь кроме свойств-идентификаторов у объектов и switch в отображении?

Zebestov 10.06.2012 22:30

Цитата:

Сообщение от PlutDem (Сообщение 1084101)
необходимость добавлять в код логики код для отображения все равно огорчает

Меня это больше удивляет.

expl 11.06.2012 01:06

Цитата:

View помещает на сцену DO в зависимости от типа объектов в World Т.е. нужно как то отличать мяч от коробки и подгружать для каждого объекта соответствующее ему изображение. Может ли кто нибудь предложить, что нибудь кроме свойств-идентификаторов у объектов и switch в отображении?
Я когда давно делал редактор мебели еще на as2 решил сильно не заморачиваться и впихнуть фабрику вьюшек в модель, это выглядело бы в as3 так:
Код AS3:

public class ConcreteItem extends ItemBase
{
    ....
    override public function newView():ViewBase
    {
        return new ConcreteView(this);
    }
 
    override public funtion getIsoView():IsoViewBase
    {
        return new ConcreteIsoView(this);
    }
}

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

Хотя, конечно, в классическом MVC модель ничего не должна знать о виде. Но, это практика - какой подход оптимален - тот и надо использовать, а не думать как там правильно блогеры советуют (они сами могут много об абстракции рассуждать, а строчить код, на 50% состоящий из синглтонов - рассказывать то всякое можно :) )

Если фабрику/тип объекта в логику не пихать, то альтернативой свитчу может быть карта/хеш-таблица "тип модели" - "фабрика вьюшки/тип вьюшки"
Впринципе, можно и свитчём - главное, чобы он в одном месте был, а не 10 похожих по всему коду (Если его удастся сделать одним - то в принципе получится то же самое, что и с хеш-таблицой)

P.S. Стало интересно код посмотреть - а то на словах можно такого насоветовать :)

Wolsh 11.06.2012 01:40

Мне кажется PlutDem спрашивал совершенно о другом.
О том что вот у нас в Модели есть список табуреток и тумбочек с координатами.
И теперь во Вьюхе надо эти табуретки и тумбочки отобразить.
То есть, увидев в списке "табурет", надо создать экземпляр класса Табурет — Модель ведь хранит не ссылку на готовый экземпляр Табурета во Вьюхе, а только запись о нем. И как быть далее во время жизни этого табурета уже после его создания, когда Вьюха обновляется от Модели, от тех же записей, но теперь табурет уже есть, и должен быть как-то связан с записью в Модели)). Ну я так понял вопрос.

expl 11.06.2012 02:07

Может быть он действительно это имел в виду.

Вроде нормальный подход:
- вюхе - ссылку на модель в конструктор при создании
- вюха слушает свою модель и изменяется
- если пришло событие от модели, что надо пододвинуть вьюху модели "model123", то возможны 2 варианта:
1. вьюха сама пододвигается, слушая событие модели "надо пододвинутся"
2. более главная вьюха находит в Dictionary мелкую вьюху по модели и сама двигает вьюху.
(добавлять ссылку на вьюшку в модель нельзя - вьюшек может быть куча - перс на главной карте, на уменьшенном макете, в диалоге, например, - а модель одна)

Остальное, видимо, в мега-треде Хорошее MVC
Ну или больше кода нужно сюда, чтобы общаться по конкретике

PlutDem 07.08.2012 02:19

Вложений: 1
Собственно, проблема была в том, что контроллер добавляет в мир новую сущность и диспатчит соответствующее событие. Главная вьюха слышит это событие и ей нужно создать отображение этой сущности., вот только какое? В предыдущей версии в событийном объекте была ссылка на сущность и в зависимости от ее класса главная вьюха погружала соответствующее представление сущности.
Код AS3:

public function onNewEntity(e:GalaxyEvent):void {
 
    if(e.entity is Ship) addChild(new ShipView(e.entity));
    if(e.entity is Shell) addChild(new ShellView(e.entity));
    if(e.entity is Wall) addChild(new WallView(e.entity));
 
}

А ведь, по сути, классы представлений разнятся только картинкой. Теперь у меня сущность хранит ссылку на свою битмапу и просто передает ее в событийном объекте главной вьюхе, ну а та уже просто добавляет ее классу отображению сущности.
Код AS3:

public function onNewEntity(e:GalaxyEvent):void {
 
    addChild(new EntityView(e.entity.bitmap));
 
}

Теперь назрел другой вопрос (см. диаграмму во вложении). Как сделать чтобы при кликах на отображения героя и монстра, герой бил мечом, а монстр нападал на героя? Ссылка в представлениях героя и монстра имеет тип Сущность, а он не имеет методов ударить мечом и атаковать героя, которые есть у классов ГЕРОЙ и МОНСТРю

Wolsh 07.08.2012 11:17

Цитата:

он не имеет методов ударить мечом и атаковать героя
А что, у Героя есть метод "съесть героя"?
Если так нравится абстракция, что Вы не можете передать герою ссылку на его собственную сущность, и он до конца игры не знает, герой он или чудовище, то может быть у такого Героя не должно быть методов "ударить мечом", а у монстра — "съесть героя"? Ведь у Сущности может быть только абстрактный метод атаковать.
А уж как именно происходит атака, заложено мультипликатором в ПредставленииГероя и ПредставленииМонстра.

dimarik 07.08.2012 23:49

Цитата:

Сообщение от PlutDem (Сообщение 1091247)
Собственно, проблема была в том, что контроллер добавляет в мир новую сущность и диспатчит соответствующее событие.

Мне больше по душе, когда контроллер меняет мир (модель) и мир, а не контроллер диспатчит событие своего изменения.

gagaga 08.08.2012 11:21

Цитата:

Сообщение от dimarik (Сообщение 1091368)
Мне больше по душе, когда контроллер меняет мир (модель) и мир, а не контроллер диспатчит событие своего изменения.

согласен с димариком

и да, на диаграмме стрелки не праильные и не в ту сторону

Добавлено через 1 минуту
волш вообще философ

Wolsh 08.08.2012 12:21

Вложений: 1
Философия в комиксах
Вложение 28304

dimarik 08.08.2012 22:48

Это ты в чем такие красивые рисуночки фигачишь? )

Wolsh 09.08.2012 00:30

В гугл-документах, ныне гугл-диск :) Бесплатно и удобно.


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

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