Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Как часто вы используете обсерверы, синглтоны и прочую глобальную муть в проектах (http://www.flasher.ru/forum/showthread.php?t=167932)

Dukobpa3 14.09.2011 17:38

Как часто вы используете обсерверы, синглтоны и прочую глобальную муть в проектах
 
Я в крупных использую.
Сейчас на одном маленьком попробовал без этого. Остался доволен. Но это в проекте с парой десятков классов не считая внешних фреймворков.

В чем-то посерьезнее я думаю довольно-таки сложно наладить коммуникации.

Здесь у меня получается что мейнКонтроллер подписан на прослушиввание от хоста событий вьюх,а во вьюхах практически все события бабблятся. И вот эти события обрабатываются частично "маленькими" контроллерами, а частично доплывают аж до мейнХоста и там обрабатываются мейнКонтроллером.

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

Поделитесь своим опытом и соображением на эти темы.

GBee 14.09.2011 20:21

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

Котяра 14.09.2011 22:43

Практически не использую. Разве что какой нибудь логгер. Изредка EventBus из as3commons и Lang оттуда же.

fish_r 15.09.2011 02:03

Вот сейчас использую в проекте основанном на Gaia. И то не синглтон, а мувик который приспособил под это дело. Это такой костылище! Но иначе контролировать все пэйджи нельзя. :( Уродская система. Совершенно её не вкурил. Заказчик, просто, настаивает на решении именно на платформе Gaia...

Dukobpa3 15.09.2011 02:25

@Котяра, а можешь поделиться идеями насчет самой структуры?

Я тут вижу три варианта:
1. контроллер общается с дочерним (скорее внучатым, ибо дочерний можно сеттерами или функциями напрямую дергать)
2. Контроллер общается с родительским контроллером(или дедушкой)
3. Общение с одноуровневым.

Как это реализовано?

Добавлено через 1 минуту
Цитата:

Вот сейчас использую в проекте основанном на Gaia. И то не синглтон, а мувик который приспособил под это дело. Это такой костылище! Но иначе контролировать все пэйджи нельзя. Уродская система. Совершенно её не вкурил. Заказчик, просто, настаивает на решении именно на платформе Gaia...
Гайя насколько я знаю сделана под флешИДЕ ? Тогда да, грабля, неудобно. Но я такие случаи не рассматривал, я даже баннеры в ФД писал:)

Dimitry_II 15.09.2011 03:22

Как же сейчас все это гладко и красиво сделано в Tide (от GraniteDS). Я уже так привык, что гляда на все свои старые телодвижения, содрагаюсь. Правда, это не чистый флеш, а флекс, но вроде при желании можно приспособить (да и исходники есть).
Удобно, что осваивать его и серверный Спринг начал примерно параллельно, поэтому принципы DI (IoC) понимал и на клиенте, и на сервере.

Возможно, сорри за оффтоп, но это близко к вопросу ТС о синглтонах - фактически Injection - одна из реализаций, только завуалированная красиво и кодом поддерживать не надо - фреймворк сам берет это на себя.

Dukobpa3 15.09.2011 03:30

Ну ДИ это одна из реализаций "глобальной мути" когда всё везде доступно и пофигу на иерархию. Так что не оффтоп.

fish_r 15.09.2011 10:52

Цитата:

Гайя насколько я знаю сделана под флешИДЕ ? Тогда да, грабля, неудобно. Но я такие случаи не рассматривал, я даже баннеры в ФД писал
Не знаю как раньше, но сейчас проект создается параллельно FlashIDE+FD или FlashIDE+FB. Но её главное неудобство не в этом. В ней объекты-страницы являются настолько автономными, что по сути представляют
собой не отдельные объекты, а отдельные программы общающиеся через крайне ограниченный интерфейс скрытый где-то в недрах фреймворка. Ну и на фига?! Спрашивается. Для любителей "в шкафу и на лыжах"?
Может я чего-то в ней не до понял (всего неделю с ней работаю), или, просто, в этом конкретном проекте она нужна как собаке пятая нога, но жутко бесит... :(

Psycho Tiger 15.09.2011 12:34

EventDispatcher - это Observer. Display List - это Composite. Очевидно, что использую.
Или речь про не нативные?

kackbip 15.09.2011 13:01

Цитата:

Сообщение от Psycho Tiger (Сообщение 1031612)
EventDispatcher - это Observer. Display List - это Composite. Очевидно, что использую.
Или речь про не нативные?

Я вот тоже очень удивился увидев вопрос про Observer.

GBee 15.09.2011 14:15

Цитата:

EventDispatcher - это Observer. Display List - это Composite. Очевидно, что использую.
Или речь про не нативные?
Я думаю не про нативные. Даже не знаю, чем EventDispatcher похож на Observer.

kackbip 15.09.2011 15:07

Цитата:

Сообщение от GBee (Сообщение 1031703)
Я думаю не про нативные. Даже не знаю, чем EventDispatcher похож на Observer.

Он не похож... это он и есть. Аналогия проста:
registerObserver - addEventListener
unregisterObserver - removeEventListener
notifyObservers - dispatchEvent
---
Так что реализация Observer-а во flash смысла не имеет. Он уже есть.

GBee 15.09.2011 15:14

Цитата:

Он не похож... это он и есть. Аналогия проста:
registerObserver - addEventListener
unregisterObserver - removeEventListener
notifyObservers - dispatchEvent
Обсервер все таки более глобален, если верить вики. Если сделать синглтон(или статиком) от ЕвентДиспатчера, накидать в него инфы, о которой он будет рассказыать и на него подписываться отовсюду, то да соглашусь евентдиспатчер станет обсервером. Хотя я в паттернах не очень.

kackbip 15.09.2011 15:21

Нет, нет и еще раз нет. При чем здесь синглтон? С какой стати вы смешиваете эти шаблоны?
Я даже вам по схемке раскидаю. По той что в вики:

Observable - EventDispatcher
Observer - Function

Соответственно ConcreteObserverable это конкретный класс реализующий EventDispatcher, а Observer это конкретный метод вызываемый в качестве обработчика. EventDispatcher это просто одна из возможных реализаций шаблона Observer.

gloomyBrain 15.09.2011 15:21

Цитата:

если верить вики
А Вы читал пример на AS3, который в той самой "вики"? Там круть!
Код AS3:

public function ExchangeRate() 
                {
                        if (_instance == null) throw new Error('Model Singleton!');
                }
 
                public static function getInstance():ExchangeRate
                {
                        if (_instance == null) {
                                _instance = new ExchangeRate();
                        }
                        return _instance;
                }

Если экземпляра нет - то конструктор выкидывает исключение. То есть получить экземляр, ну хоть убейся, не получится. Так что лучше забить на wiki и читать форум =)

kackbip 15.09.2011 15:33

Ндааааа... ForeverAloneton

Dukobpa3 15.09.2011 15:36

Цитата:

А Вы читал пример на AS3, который в той самой "вики"? Там круть!
Там вообще-то стандартный синглтон.

Цитата:

EventDispatcher - это Observer. Display List - это Composite. Очевидно, что использую.
Или речь про не нативные?
Речь идет конечно про ненативные. ЕвентДиспатчер даже с бабблингом передает только по дисплейлисту, А как например заставить общаться между собой контроллеры на разных уровнях, через диспатчи во вьюхах? Не всегда удобно. Если без вьюх то на ивенты получится подписаться только родителю на дитя. Чтобы это обойти пишутся разного рода обсерверы.

GBee 15.09.2011 15:37

Цитата:

Нет, нет и еще раз нет. При чем здесь синглтон? С какой стати вы смешиваете эти шаблоны?
Я даже вам по схемке раскидаю. По той что в вики:

Observable - EventDispatcher
Observer - Function

Соответственно ConcreteObserverable это конкретный класс реализующий EventDispatcher, а Observer это конкретный метод вызываемый в качестве обработчика. EventDispatcher это просто одна из возможных реализаций шаблона Observer.
Я же говорю в шаблонах слаб. По вики-примеру на АС3 я и сделал умозаключение (отсюда и синглтон). Причем не ради спора, а чтобы разобраться самому. Просто я думал что Обсервер это какой-то всегда глобальный хранитель данных, который рассказывает всем наблюдателям об их изменении.

Вот вы мне сейчас разжевали, я в вики повнимательнее рассмотрел схему. И до меня дошло. Спасибо.


Цитата:

А Вы читал пример на AS3, который в той самой "вики"? Там круть!
:о)) Не заметил.

Цитата:

Так что лучше забить на wiki и читать форум =)
Ну здесь бабушка надвое сказала. :о)

Dukobpa3 15.09.2011 15:42

Цитата:

Вот вы мне сейчас разжевали, я в вики повнимательнее рассмотрел схему. И до меня дошло. Спасибо.
ЕвентДиспатчер как раз и есть одна из реализаций обсервера, только это абсолютно не сферический обсервер в вакууме, а очень даже специфический заточенный под исплей лист.

В массе своей обсервер понимается именно как что-то глобальное с синглтоном.

alatar 15.09.2011 15:46

Цитата:

А как например заставить общаться между собой контроллеры на разных уровнях, через диспатчи во вьюхах? Не всегда удобно.
Например сделать EventBus. Все контроллеры получат экземпляр EventDispatcher и будут гонять события через него. На любой уровень. Баблинг без DisplayObject'ов тоже реализуем.

GBee 15.09.2011 15:48

Цитата:

В массе своей обсервер понимается именно как что-то глобальное с синглтоном.
Ну как я понял никто не мешает сделать синглтон от ЕвентДиспатчера и получить ConcreteObserverable

alatar 15.09.2011 15:48

Контроль количества экземпляров можно сделать и без синглтонов. Синглтон просто один из способов.

kackbip 15.09.2011 15:48

Цитата:

Сообщение от Dukobpa3 (Сообщение 1031735)
ЕвентДиспатчер как раз и есть одна из реализаций обсервера, только это абсолютно не сферический обсервер в вакууме, а очень даже специфический заточенный под исплей лист.

В массе своей обсервер понимается именно как что-то глобальное с синглтоном.

FileReference - DisplayObject?
LoaderInfo - DisplayObject?
URLLoader - DisplayObject?

Причем тут дисплей лист?

Dukobpa3 15.09.2011 15:50

Цитата:

Например сделать EventBus
это что? Всунуть в базовый класс контроллера какой-то статик дисплейОбжект и им диспатчить и на него подписываться?

Код AS3:

FileReference - DisplayObject?
LoaderInfo - DisplayObject?
URLLoader - DisplayObject?

Бабблинг?

TanaTiX 15.09.2011 15:53

Цитата:

Ну здесь бабушка надвое сказала.
Хоть вики, хоть форум - ко всему нужно относиться критично. Но форум явно в приоритете.

alatar 15.09.2011 15:55

Цитата:

Всунуть в базовый класс контроллера какой-то статик дисплейОбжект и им диспатчить и на него подписываться?
Не обязательно. Его может раздавать и главный контроллер при создании дочернего, либо инжектор добавит при регистрации, если используется IoC, либо... Короче, способов много.
Цитата:

Бабблинг?
Причем тут баблинг, к вашему утверждению? Где вы видели обязательную реализацию баблинга у обсервера?

kackbip 15.09.2011 15:55

Цитата:

Сообщение от Dukobpa3 (Сообщение 1031741)
Бабблинг?

Баблинг не баблинг, но я не согласен что EventDispatcher
Цитата:

заточенный под исплей лист

GBee 15.09.2011 16:01

Цитата:

Хоть вики, хоть форум - ко всему нужно относиться критично. Но форум явно в приоритете.
По критике? :о)

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

Тогда можно быстро найти ответ как в вики. ;о)

Dukobpa3 15.09.2011 16:02

Цитата:

Причем тут баблинг, к вашему утверждению? Где вы видели обязательную реализацию баблинга у обсервера?
Тема вообще началась с вопроса а не утверждения. Утверждение только в том что диспатчер в базовой реализации ас3 не всегда удобен, так как все его плюшки становятся доступными только для дисплей листа. Без дисплей листа мы уже теряем как минимум тот же бабблинг. О том что диспатчер не является обсервером я ни разу не сказал, сказал только то что его реализация довольно-таки специфична.

Цитата:

Баблинг не баблинг, но я не согласен что EventDispatcher
Цитата:
заточенный под исплей лист
Цитата:

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

Добавлено через 1 минуту
Цитата:

введите теги,
А за отсутствие тегов минус в карму:) Автоматом. Сам поначалу ставил потом понял что я такой почти один) Перестал париться.

alatar 15.09.2011 16:07

Цитата:

Но мне кажется чем использовать такой бубен со стандартным диспатчером проще таки реализовать свой обсервер для контроллеров.
Монопенисуально. Чем проще?

Dukobpa3 15.09.2011 16:13

Цитата:

Монопенисуально. Чем проще?
В использовании например. Позволить диспатчить контроллерам напрямую в контроллер того же уровня или еще какие варианты. Вместо прохождения до корня а потом от корня на тот же уровень но в другую ветку. Хотя согласен что если тот статик дисплейОбжект запилить то такая схема само собой получится.

З.Ы, Если уж плясать от добавления дисплей обжекта в контроллер то можно и хостом диспатить, на хост триады у контроллера ссылка то есть. И тот самый хост как правило добавлен в дисплейлист родительского хоста. А я например стараюсь каждой триаде выделять отдельный контейнер, получается то же четкое дерево хостов как и самих контроллеров.

alatar 15.09.2011 17:06

При чем тут вообще DisplayObject? EventDispatcher не является DisplayObject, верно только обратное утверждение.
Цитата:

Вместо прохождения до корня а потом от корня на тот же уровень но в другую ветку.
Фазы событий вообще используются только для DisplayObject. Если у вас контроллеры (внезапно) не являются потомками DisplayObject, то их придется эмулировать.
Цитата:

Позволить диспатчить контроллерам напрямую в контроллер того же уровня или еще какие варианты.
Концепция EventBus это реализует.

Dukobpa3 15.09.2011 17:12

Цитата:

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

Добавлено через 1 минуту
Цитата:

При чем тут вообще DisplayObject?
ну вот при этом же:
Цитата:

Фазы событий вообще используются только для DisplayObject.

Котяра 15.09.2011 17:13

вьюха не обязательно DisplayObject

alatar 15.09.2011 17:15

Цитата:

А с чего бы контроллерам были дисплейными?
Это я у вас спрашиваю, с чего бы?

Dukobpa3 15.09.2011 17:16

Цитата:

Это я у вас спрашиваю, с чего бы?
Непонятно откуда вопрос возник:) Я ни разу на это даже не намекал)

alatar 15.09.2011 17:37

Я привел цитату, откуда возник этот вопрос. Возможно я вас неправильно понял.

Dukobpa3 15.09.2011 17:40

Ну не важно. А что скажете на тему диспатча ивентов хостами из контроллеров?
Всё-таки идея сохранения структуры дерева мне интересна. Чтоб не пихать глобальных евентБусов или же своих обсерверов.

alatar 15.09.2011 17:50

Получится тот же event bus, только менее гибкий, т.к. шин событий может быть и несколько.

Psycho Tiger 15.09.2011 19:22

Резюме: единственный минус нативных событий - в отсутствии их нативного бабблинга вне DisplayObject.

За всю мою жизнь требовалось бабблить событие не из вью... ну раза 2-3. И то контроллерами. И я без тени презрения забаблил их из контроллера по ветке вью. Реальный случай когда нужен бабблинг по моделям мне до сих пор не встретился.

Кстати, мне до сих пор кажется, что синглтон используют ради его глобальности и только. Типа просто static - нуб, а если синглтон - то это паттерн, и не нуб )

Уходите от предрасудков, господа. Делайте так как удобно и положите на названия. Тут дело не в выборе слова.


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

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