Форум 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. Стало интересно код посмотреть - а то на словах можно такого насоветовать :)


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

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