Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.10.2013, 17:56
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 1  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
По умолчанию Как устроена работа событий

Со вчерашнего вечера в мою голову закрались сомнения, которые не дают мне покоя, только об этом и думаю.
А дело вот в чём - после того, как я открыл книгу с шаблонами проектирования, моё сознание погрузилось в астрал, где я с чувством радости применял полученные знания на деле.
Вчера, когда я начал проверять работу вью ( да, я всё ещё не построил до конца работу MVC, приходится читать и читать.. ) которая у меня построена на двух шаблонах ( композиция и наблюдатель ), что всё что я делаю, можно сделать и без этих шаблонов, родными событиями. Потом я начал рассуждать дальше и мне показалось, что события ведь тоже не просто так кто то придумал, наверняка они как раз как наблюдатель и работают, что наталкивает на мысль о лишнем применении наблюдателя во вью. И вот пришёл на форум, чтобы спросить, так ли это и о том, как устроена работа родных событий.. И увидел тему чуть выше.
Сначала я подумал, что сейчас отвечу, что всё это решается событиями, но вдруг пришла мысль, что СКОЛЬКО ЖЕ придётся создавать слушателей, ведь каждый слушатель это новый обьект в памяти. И что лучше один наблюдатель. И следом я подумал, что я так и не знаю как устроена работа событий, создается ли какой то новый обьект при подписке или всё происходит по другому.
Вобщем я был бы очень рад, если кто нибудь бы мне это обьяснил. И отдельно был бы счастлив, если бы опытные ответили что они применяют в похожих случаях ( как например структура вью ), обходятся ли они событиями или же применяют какие то паттерны?

Старый 15.10.2013, 18:33
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 2  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
На примере:
Код AS3:
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
Я не рассматривал всплытие событий, при всплытии события могут и будут пересоздаваться, но в общем случае все именно так, как написано выше.
__________________
...вселенская грусть

Старый 16.10.2013, 00:11
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 3  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Паттерн Наблюдатель в AS3 по большей части не нужен, т.к. есть нативный EventDispatcher и передача ссылки на методы отсутствующие в java, для которой, в основном Gof и написаны были.
Есть правда в java-spring итп, довольно удобный паттерн - Глобальная шина или бродкастер, но реализации в as3 грешат явовщиной, когда достаточно сделать какой-нибуть статик конст (в классе утилит или вообще в отдельном файле eventBus.as
Код AS3:
public static const eventBus:EventDispatcher = new EventDispatcher();
Но!
Обратите ваше внимание на сигналы. Тоже довольно интересная концепция колбэков, к сожалению не нативаная и без баблинга, но имеющая свои преимущества.
Цитата:
то каждый из них в параметры получит один и тот же объект, он не будет пересоздаваться.
К сожелению, это не так. События клонируются в целях защиты ( я так думаю) для каждого хэндлера.
__________________
Отряд Котовскага

Старый 16.10.2013, 00:24
elder_Nosferatu вне форума Посмотреть профиль Отправить личное сообщение для elder_Nosferatu Найти все сообщения от elder_Nosferatu
  № 4  
Ответить с цитированием
elder_Nosferatu
 
Аватар для elder_Nosferatu

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
Цитата:
Сообщение от Котяра Посмотреть сообщение
События клонируются в целях защиты ( я так думаю) для каждого хэндлера.
Можно и проверить. Создать несколько обработчиков любого события, подписать их на это событие и при вызове каждый из них должен хапихать полученое событие в общий массив. А потом сравнить...

Добавлено через 6 минут
Проверил на событии ADDED_TO_STAGE. Подписал Главний_Класс на это событие тремя разными хендлерами. Каждый из низ получил одинаковый event.

Старый 16.10.2013, 01:05
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 5  
Ответить с цитированием
Akopalipsis
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/
Цитата:
Паттерн Наблюдатель в AS3 по большей части не нужен
Вот и мне после того как я его реализовал, показалось, что он лишний, что события делают тоже самое.
Но эта уже другая тема, пойду в неё спрошу.) Спасибо Вам всем.

Старый 16.10.2013, 11:48
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 6  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
К сожелению, это не так. События клонируются в целях защиты ( я так думаю) для каждого хэндлера.
События клонируются при всплытии. Когда мы сами пишем new Event() никто никого не клонирует, иначе смысл создания объекта события теряется. Хотя его и так не очень много =)
__________________
...вселенская грусть

Старый 16.10.2013, 13:57
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 7  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Сообщение от Котяра Посмотреть сообщение
К сожелению, это не так. События клонируются в целях защиты ( я так думаю) для каждого хэндлера.
Тогда бы не работал preventDefault.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 16.10.2013, 16:15
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 8  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Паттерн Наблюдатель в AS3 по большей части не нужен,
Возможно я ошибаюсь, но если у меня есть узел и на его уровне я пускаю событие
Код AS3:
dispatchEvent(new Event(NodeEvents.RESTART));
обработчики которого есть в каждом классе унаследованного от этого узла,
то все классы примут это событие. И у меня тогда вопрос - есть способ это решить?
Ведь нельзя слушая в десяти классах рутовый класс одно и тоже событие, направлено послать это событие в определенный.
Или такая конструкция результат кривой архитектуры?

Старый 16.10.2013, 16:22
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 9  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Akopalipsis - непонятен вопрос в корне. Чего решать то собрались? Ну подписаны вы в 10 классах на свой рестрат, ну раз подписаны, значит так сами и захотели. в чем вопрос?
__________________
Марк Tween

Старый 16.10.2013, 16:39
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 10  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Вопрос вот в чём - есть рутовый класс магия ( или статистика магии, я не знаю как правильно ), который в себе содержит несколько детей, уровень манны и уровень кол-во стойкости к магическим атакам.
И вот герой находит артефакт, который восстанавливает всё на сто процентов и рутовый класс шлёт событие рестарт ( вернуть всё на сто процентов ) и все дети это делаю как нужно. Но потом герой находит артефакт, который повышает на сто процентов только манну. И тут он опять шлёт событие рестарт, но ведь его примут опять все классы. И тут может в логике ошибка, но ведь в любом случаи эти классы будет что то связывать, а значит и одно событие будет везде обрабатываться.

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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