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

Вернуться   Форум Flasher.ru > Блоги > e4xu

Всякие разные штуки сомнительной полезности сделанные в свободное от работы время.
Оценить эту запись

Система сигнал-слот в AS3

Запись от wvxvw размещена 07.02.2010 в 14:04
Обновил(-а) wvxvw 13.02.2010 в 04:54

Продолжительные попытки оптимизировать работу событий в AS3 привели к написанию этой небольшой библиотеки.
В чем заключаются отличия от штатного EventDispatcher и Event.
  • Вызов колбека (хендлера, он же слот) не сопровождается созданием нового, зачастую не нужного объекта - события.
  • Типы "событий" заранее извесны, никаких "непредвиденых событий" объекты диспатчить не могут. Аналогично, нельзя подписаться на несуществующее "событие".
  • Колбеку можно задать типы и количество принимаемых параметров.
  • Реализация аналогов target, currentTarget, stopPropagation, handled оставлена "на откуп" программисту использующему библиотеку т.е. захотите - добавьте.
  • Аналог useCapture не возможен в силу специфики реализации.
Возможные недостатки, или "рекомендации к использованию":
Не стоит пытаться заменить нативные события, т.как это будет явно непродуктивно. Ну и не стоит использовать в небольших проектах, в которых количество вещаемых событий не на столько велико, чтобы повлиять на продуктивность. Возможно, не до конца идеально продумана реализация (на уровне интерфейса), так что возможны доработки.
Пример использования:
Код AS3:
package signals 
{
	//{ imports
	import flash.display.Sprite;
	import org.wvxvws.signals.ISemaphore;
	import org.wvxvws.signals.SignalError;
	import org.wvxvws.signals.Signals;
	//}
 
	/**
	 * TestAsteriscNamespace class.
	 * @author wvxvw
	 * @langVersion 3.0
	 * @playerVersion 10.0.32
	 */
	public class SignalsExample extends Sprite implements ISemaphore
	{
		//--------------------------------------------------------------------------
		//
		//  Public properties
		//
		//--------------------------------------------------------------------------
 
		public static const FOO:Vector.<Class> = new <Class>[int];
		public static const BAR:Vector.<Class> = new <Class>[String, int];
 
		/* INTERFACE org.wvxvws.signals.ISemaphore */
 
		public function get signals():Signals { return this._signals; }
 
		//--------------------------------------------------------------------------
		//
		//  Protected properties
		//
		//--------------------------------------------------------------------------
 
		protected var _signals:Signals;
 
		//--------------------------------------------------------------------------
		//
		//  Constructor
		//
		//--------------------------------------------------------------------------
 
		public function SignalsExample() 
		{
			super();
			this._signals = new Signals(this);
			this._signals.add(FOO, this.slotTest3);
			this._signals.add(BAR, this.slotTest);
			this._signals.add(BAR, this.slotTest2);
			this._signals.call(BAR, "Foo", 100);
			this._signals.call(FOO, 200);
			try
			{
				this._signals.call(FOO, "Foo", 100);
			}
			catch (error:SignalError)
			{
				// Attempting to call slot with wrong signature.
				trace(error.message);
			}
		}
 
		//--------------------------------------------------------------------------
		//
		//  Public methods
		//
		//--------------------------------------------------------------------------
 
		/* INTERFACE org.wvxvws.signals.ISemaphore */
 
		public function signalTypes():Vector.<Vector.<Class>>
		{
			return new <Vector.<Class>>[FOO, BAR];
		}
 
		//--------------------------------------------------------------------------
		//
		//  Private methods
		//
		//--------------------------------------------------------------------------
 
		private function slotTest(par0:String, par1:int):void
		{
			trace("slotTest called", par0, par1);
		}
 
		private function slotTest2(par0:String, par1:int):void
		{
			trace("slotTest2 called", par0, par1);
		}
 
		private function slotTest3(par1:int):void
		{
			trace("slotTest3 called", par1);
		}
	}
}
Исходники:
http://code.google.com/p/e4xu/source...wvxvws/signals

EDIT: Немножко упростил и почистил АПИ.
Всего комментариев 61

Комментарии

Старый 13.07.2010 15:56 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Нет. Ты создал класс кототый диспатчит BlooDHounDEven.FOO, я его расширил и добавил WVXVWEvent.FOO - подписался на свое событие, а получил твое.
Старый 13.07.2010 16:27 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
дык сам виноват ) у тебя метаданными сказано, что такое событие уже есть.
зато с сигналами я смогу подправить событие в принципе.
за то ты мог бы подписаться на моё событие с максимальным приоритетом, и останавливать его, не давай распространяться дальше, а своё пропускать.
Старый 13.07.2010 16:51 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Ну так это и есть плохая типизация / отсутствие проверки во время компиляции. А так все ошибки в программах происходят по вине тех, кто их пишет.
Старый 13.07.2010 16:55 i.o. вне форума
i.o.
 
Аватар для i.o.
Немного не в тему. Есть ли автоматизированный способ генерации метаданных для [Event] во FlashDevelop? Чтобы автоматом определялось какие эвенты диспатчатся в классе, и прописывались для них метаданные? Руками тоже не проблема сделать, просто интересно стало.
Старый 13.07.2010 17:00 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
wvxvw, ну так такого рода ошибок и для сигналов можно насобирать целый паровоз.
Старый 13.07.2010 17:02 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Нет, или я не понял вопрос. Метадата напрямую не связана с событиями. Вы можете написать метадату и никогда описаное событие не диспатчить и наоборот. Это как табличка "баран" на клетке со львом.
Старый 13.07.2010 17:05 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Блуд, это софистика и непонимание вопроса + бесконечное желание доказать свою точку зрения потому, что она твоя. Тебе говорят что дважды два четыре, а ты втираешь про квантовую механику, и что возможно в каких-нибудь эзотерических состояниях материи дважды два будет пять.
Старый 13.07.2010 17:32 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
wvxvw, боюсь, что это не так. на сим удаляюсь кататься на велосипедах.
Старый 13.07.2010 23:10 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
единственный недостаток это необходимость описывать метаданными события.
Цитата:
у тебя метаданными сказано, что такое событие уже есть
Цитата:
Метадата напрямую не связана с событиями. Вы можете написать метадату и никогда описаное событие не диспатчить и наоборот. Это как табличка "баран" на клетке со львом.
спросил сегодня про метаданные.. я про них пока чайник полный - т.е. я их пользую, но как они точно работают пока не в курсе.
так вот метеданные это супер или это костыль? какое отношение метаданные имеют к языку? Можно ли их считать расширением языка? моё имхо, что это просто узаконенные костыли.
Старый 13.07.2010 23:25 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Метаданные это просто запись. Они ни к чему не обязывают. Есть какие-то данные, которые используются плеером, - для сериализации, например, или те же события, или для того, чтобы найти какие свойства компонента показать в редакторе. Иногда в проекте может возникнуть необходимость сохранить какую-то дополнительную информацию вместе со свойством / методом / классом. Например, если мы хотим, чтобы у нас определенные колбеки проверялись на соответствие сигнатуры перед тем, как мы их передаем куда-то:

Код AS3:
[Callback("String", "int")]
public function set callback(value:Function):void
{
. . .
}
 
public function get callback():Function
{
. . .
}
. . .
public function setCallback(owner:Object, property:String):void
{
    var xml:XML = describeType(owner).*.property.(@name == property)[0];
    if (xml.meta.Callback . . .)
    else throw new ArgumentError();
}
Сорри, я не помню точно формат записи метаданных, но идея должна быть понятна. Т.е. у нас было поле типа Function, а мы дописали доп. инфо о том, что там будут только функции принимающие String и int, например.
Старый 14.07.2010 16:31 dimarik вне форума
dimarik
 
Аватар для dimarik
Ап чем спор-то, господа? Я не уловил.
 

 


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


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