Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как реализована событийная модель в AS3? (http://www.flasher.ru/forum/showthread.php?t=139673)

gloomyBrain 07.05.2010 20:14

Как реализована событийная модель в AS3?
 
Всем привет
Вопрос возник при реализации собственной модели на JAVA

Принцип везде одинаков - есть EventDispatcher, который содержит список тех, кого надо уведомить. Вернее не список, а HashMap, где ключи - это строки (имена событий), а значения - это массивы обработчиков. И есть сами обработчики.
При вызове dispatchEvent(evt:Event) наш EventDispatcher проходит по всему списку обработчиков и вызывает в них...

А вот и вопрос - что он в них вызывает? Ведь класс может быть динамическим. Значит при вызове dispatchEvent() мы у каждого объекта проверяем наличие нужного метода? Плюс мы должны проверить, от таких ли параметров вызывается метод? плюс - тот ли тип данных он возвращает?

... Тогда это жутко медленно должно быть =) Получается, что вместо dispatchEvent нужно пользоваться прямым вызовом метода.
Или я неправильно понимаю событийную модель в AS3?

Gaen 07.05.2010 21:26

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

BlooDHounD 07.05.2010 22:39

Цитата:

Сообщение от gloomyBrain (Сообщение 906703)
А вот и вопрос - что он в них вызывает? Ведь класс может быть динамическим. Значит при вызове dispatchEvent() мы у каждого объекта проверяем наличие нужного метода? Плюс мы должны проверить, от таких ли параметров вызывается метод? плюс - тот ли тип данных он возвращает?

а чем в ту самую реализацию смотрели? Вы вообще видели сигнатуру метода addEventListener?
Цитата:

Сообщение от GAIKER (Сообщение 906716)
Ежели в качестве слушателя передается ссылка на метод динамического объекта, которого может и не быть, то при попытке вызова получим рантайм еррор.

вычитайтесь в то, что Вы написали. если передаётся ссылка как её потом, может не стать, если Вы её уже передали? и какая разница какого объекта метод Вы передаёте? метод - такой же объект.

Котяра 07.05.2010 22:53

лучше посмотри на событийную модель с# - там круче. нет строковости - строгая типизация - автокомплит и вообще..

gloomyBrain 07.05.2010 23:17

Цитата:

если передаётся ссылка как её потом, может не стать, если Вы её уже передали?
Вот где я протупил

Цитата:

лучше посмотри на событийную модель с# - там круче
Объясни на пальцах? Я сейчас в раздумьях - надо ли мне оно, ибо можно все провернуть через прямое выполнение метода. Но от этого теряется некоторая гибкость, которая мне так нравится в AS3

Gaen 07.05.2010 23:49

Цитата:

Сообщение от BlooDHounD (Сообщение 906733)
вычитайтесь в то, что Вы написали. если передаётся ссылка как её потом, может не стать, если Вы её уже передали? и какая разница какого объекта метод Вы передаёте? метод - такой же объект.

Ничего никуда не пропадает, я имел в виду случай, когда метода не существует изначально.

Код AS3:

var o:Object = {};
this.addEventListener("someEvent", o.someHandler);

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

BlooDHounD 07.05.2010 23:55

GAIKER, тогда я Вас разочарую ещё разок:
Цитата:

Сообщение от GAIKER (Сообщение 906716)
... то при попытке вызова получим рантайм еррор.

ога. а я думал, что при попытке обращения.

wvxvw 07.05.2010 23:57

А еще лучше посмотреть в Qt, а потом посмотреть в Haskel или Common Lisp :) A вообще, это вечная тема для обсуждений, т.как в СРР темплейты не ахти - не хочется плодить кучи классов, а с другой стороны, если хочется с параметрами, то где-то птийдется терять типизацию, а если не терять типизацию, то тогда терять производительность, а если не терять, то это только либо в чисто функциональных языках, либо в мультипарадигменных, которые позволяют функциональный подход :)
ЗЫ C# - мультипарадигменный, как и CL.

Gaen 08.05.2010 01:17

Цитата:

Сообщение от BlooDHounD (Сообщение 906756)
GAIKER, тогда я Вас разочарую ещё разок:ога. а я думал, что при попытке обращения.

С каких пор? Объект динамический, при обращении к несуществующему свойству преспокойно вернет null без всяких ошибок.

BlooDHounD 08.05.2010 01:27

ну я неправильно выразился. но Вы ещё более неправильно это сделали =) я имел ввиду при передачи параметра. то есть прямо там где написано и будет ошибка. до вызова дело просто не дойдёт. приложение упадёт в addEventListener.

Gaen 08.05.2010 01:42

Проверил. Действительно, addEventListener ругается на null, что в принципе логично.

Я имел в виду, что если автор при реализации своего аналога addEventListener опустит проверку на null, приложение в итоге все равно корректно свалится, но только уже при обработке события. Хотя лучше конечно проверять сразу при подписывании, как это сделано во флэше.

gloomyBrain 08.05.2010 02:02

Цитата:

приложение в итоге все равно корректно свалится
Приложение к ActionScript имеет косвенное отношение =)
Просто захотелось разобраться (в корыстных целях) как оно выглядит "изнутри"

ЗЫ
Как так получается - что мы получаем объект по методу? То есть в addEventListener() мы указываем метод, и уже сразу знаем в каком объекте его вызывать. Этого я так и не понял. Видимо в методе (как в объекте) есть ссылка (доступная только для AVM) на экземпляр, которому он принадлежит. Как-то странно получается =)

wvxvw 08.05.2010 02:11

В AS3 функции - объекты, в Java - нет, ну на сколько я знаю.

gloomyBrain 08.05.2010 02:13

В java есть класс Method, но он в данном случае бесполезен, ибо как раз ссылки на объекта-обладателя (не класса, а объекта) не предоставляет =( *ушел плакать*

UPD
Ах вот оно что...

BlooDHounD 08.05.2010 02:24

gloomyBrain, и зачем Вам apply? Вы не в курсе, что у событий в АС3 фиксированная сигнатура?

gloomyBrain 08.05.2010 02:31

Ну там чуть пониже такая штука есть =)
Цитата:

public function broadcastEvent(evnt:String, ...args):void {
for(var i:uint = 0; i < listeners.length; i++) {
listeners[i][evnt].apply(listeners[i], args);
}
}
короче в java реализация такого возможна, но это D&G (дорого и глупо)


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

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