![]() |
|
||||||||||
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Со вчерашнего вечера в мою голову закрались сомнения, которые не дают мне покоя, только об этом и думаю.
А дело вот в чём - после того, как я открыл книгу с шаблонами проектирования, моё сознание погрузилось в астрал, где я с чувством радости применял полученные знания на деле. Вчера, когда я начал проверять работу вью ( да, я всё ещё не построил до конца работу MVC, приходится читать и читать.. ) которая у меня построена на двух шаблонах ( композиция и наблюдатель ), что всё что я делаю, можно сделать и без этих шаблонов, родными событиями. Потом я начал рассуждать дальше и мне показалось, что события ведь тоже не просто так кто то придумал, наверняка они как раз как наблюдатель и работают, что наталкивает на мысль о лишнем применении наблюдателя во вью. И вот пришёл на форум, чтобы спросить, так ли это и о том, как устроена работа родных событий.. И увидел тему чуть выше. Сначала я подумал, что сейчас отвечу, что всё это решается событиями, но вдруг пришла мысль, что СКОЛЬКО ЖЕ придётся создавать слушателей, ведь каждый слушатель это новый обьект в памяти. И что лучше один наблюдатель. И следом я подумал, что я так и не знаю как устроена работа событий, создается ли какой то новый обьект при подписке или всё происходит по другому. Вобщем я был бы очень рад, если кто нибудь бы мне это обьяснил. И отдельно был бы счастлив, если бы опытные ответили что они применяют в похожих случаях ( как например структура вью ), обходятся ли они событиями или же применяют какие то паттерны? |
|
|||||
|
На примере:
private function onCompelte(event:Event):void { trace("Hello world!"); } ... var ed:EventDispatcher = new EventDispatcher(); ed.addEventListener(Event.COMPLETE, onComplete); ... ed.dispatchEvent(new Event(Event.COMPLETE)); Когда мы вызываем addEventListener, никакого объекта не создается. Происходит следующее: - объекту ed передается ссылка на функцию, которую нужно будет вызывать - объекту ed передаются условия, при которых эту функцию нужно вызывать (а именно - тип события, у нас это Event.COMPLETE) - когда происходит вызов ed.dispatchEven(), объект ed смотрит, есть ли у него слушатели для события Event.COMPELTE. - ed идет циклом по всем функциям-слушателям для такого типа событий и каждую такую функцию вызывает, передавая объект события (new Event(...)) в качестве параметра. - так как конструкцию new Event(...) мы пишем сами, то вполне очевидно, что то что мы создали, то и передается поочередно всем функциям. То есть если у Вас зарегистрировано 100 слушателей, то каждый из них в параметры получит один и тот же объект, он не будет пересоздаваться. Вот и все, довольно просто на самом деле. PS Я не рассматривал всплытие событий, при всплытии события могут и будут пересоздаваться, но в общем случае все именно так, как написано выше.
__________________
...вселенская грусть |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Паттерн Наблюдатель в AS3 по большей части не нужен, т.к. есть нативный EventDispatcher и передача ссылки на методы отсутствующие в java, для которой, в основном Gof и написаны были.
Есть правда в java-spring итп, довольно удобный паттерн - Глобальная шина или бродкастер, но реализации в as3 грешат явовщиной, когда достаточно сделать какой-нибуть статик конст (в классе утилит или вообще в отдельном файле eventBus.as Но! Обратите ваше внимание на сигналы. Тоже довольно интересная концепция колбэков, к сожалению не нативаная и без баблинга, но имеющая свои преимущества. Цитата:
__________________
Отряд Котовскага |
|
|||||
|
Можно и проверить. Создать несколько обработчиков любого события, подписать их на это событие и при вызове каждый из них должен хапихать полученое событие в общий массив. А потом сравнить...
Добавлено через 6 минут Проверил на событии ADDED_TO_STAGE. Подписал Главний_Класс на это событие тремя разными хендлерами. Каждый из низ получил одинаковый event. |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
http://www.dehash.com/2010/03/07/as3...bubbling-note/ Цитата:
Но эта уже другая тема, пойду в неё спрошу.) Спасибо Вам всем. |
|
|||||
|
Цитата:
__________________
...вселенская грусть |
|
|||||
|
Тогда бы не работал preventDefault.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
обработчики которого есть в каждом классе унаследованного от этого узла, то все классы примут это событие. И у меня тогда вопрос - есть способ это решить? Ведь нельзя слушая в десяти классах рутовый класс одно и тоже событие, направлено послать это событие в определенный. Или такая конструкция результат кривой архитектуры? |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Вопрос вот в чём - есть рутовый класс магия ( или статистика магии, я не знаю как правильно ), который в себе содержит несколько детей, уровень манны и уровень кол-во стойкости к магическим атакам.
И вот герой находит артефакт, который восстанавливает всё на сто процентов и рутовый класс шлёт событие рестарт ( вернуть всё на сто процентов ) и все дети это делаю как нужно. Но потом герой находит артефакт, который повышает на сто процентов только манну. И тут он опять шлёт событие рестарт, но ведь его примут опять все классы. И тут может в логике ошибка, но ведь в любом случаи эти классы будет что то связывать, а значит и одно событие будет везде обрабатываться. Добавлено через 1 минуту Если говорить, что ты делай и там увидешь, вот я дошел до этого момента, а как строить события между разными ветвями ума не приложу. Сделать что то вышестоящие и рассылать сообщения с самого верха, значит отказаться от методов рестарт, инит и делать сто констант, инитА, инитВ.. |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:25. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|