Форум 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

Комментарии

Старый 07.02.2010 15:35 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
а что за такая конструкция?
Код AS3:
new <Class>
впервые вижу
Старый 07.02.2010 17:15 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Это просто короткая запись Vector.<T>([массив который нужно конвертнуть]); Так можно писать начиная со второй беты 4-го СДК.
Старый 07.02.2010 17:28 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
но у тебя она выглядит без скобок и Vector'а
Код AS3:
new <Class>[String, int]
может есть в доках об этом почитать, куда копать?
Старый 07.02.2010 19:03 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
http://bugs.adobe.com/jira/browse/ASC-3695
Это когда заимплементили.
http://blog.flexexamples.com/2009/06...rol-in-flex-4/
Это пример с объяснением.
Старый 09.04.2010 23:41 bw_left вне форума
bw_left
А можно пример с разницей, пожалуйста - чет я недогоняю
Старый 10.04.2010 13:28 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Старый 16.04.2010 12:45 Котяра вне форума
Котяра
 
Аватар для Котяра
Нашёл библиотеку от Robert Penner
http://wiki.github.com/robertpenner/as3-signals/
тут видео-туториал
Старый 16.04.2010 16:59 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Да, есть такая, в тесте по ссылке выше именно она и используется, но есть еще много разных. Вот, самая простая:
http://github.com/stroncium/hx-signals
Например.
Старый 16.04.2010 17:52 Котяра вне форума
Котяра
 
Аватар для Котяра
ага. вижу:
Цитата:
* EventDispatcer addEventListener (priority) 38
* EventDispatcer dispatchEvent 1
* Signals add (priority) 5
* Signals call 4
* DeluxeSignal add (priority) 170
* DeluxeSignal dispatch 1
а как обстоит дело с тестами без приоритетов?
и еще: имя метода signals.call - не логичнее ли было назвать dispatсh? Да и класс наверное Signal а не Signals.
Конечно хозяин-барин.. это я так.. мимо проходил..
А вообще очень здорово. Как я понял - чтобы сигнализировать сигналы ( о-как!) не надо быть никаким eventDispatcher'om достаточно завести в классе этот сигнал.. очень подходит. Будем брать..
Обновил(-а) Котяра 16.04.2010 в 17:56
Старый 17.04.2010 15:46 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Signals - потому что в классическом варианте сигнал только одного типа может быть - т.е. принимать только один тип аргументов.
По поводу других тестов - сейчас цифр нет, но почти наверняка у DeluxeSignal и EventDispatcer время на добавление будет существенно меньше. Но дальше есть еще всякие подводные камни, например, раз отдиспатчив событие EventDispatcer'ом, его больше никак нельзя отдиспатчить. А в том, что касается DeluxeSignal и его младших братьев - там нет возможности остановится не вызвав всех слушателей. Ну, если скажем, добавлять события с приоритетами - скорее редкость, то необходимость перестать диспатчить события после того, как вызвался какой-то из подисчиков возникает довольно часто.
Что пока не представляется возможным сделать ни в AS3 ни в HaXe - добиться, чтобы ошибки были при компиляции, а не во время выполнения. Т.е. либо прийдется плодить много классов типа Signal0, Signal1, Signal2 принимающих, соответственно 0, 1, 2 параметра для колбека, либо довольствоваться рантайм ошибками. Это можно попытаться сделать на темплейтах, но тогда мы все равно получим много классов вместо одного.
Еще когда-то предлагался вариант с более строгой типизацией параметров передаваемых в слушатель, интересная штука, но так нигде и не использовал:

Код AS3:
class Tuple
{
    public var type:Class;
    public var next:Tuple;
    public var value:Object;
}
И формировать параметры примерно так:

Код AS3:
var params:Tuple = new Tuple();
params.type = int;
params.value = 100;
params.next = new Tuple();
params.next.type = String;
params.next.value = "foo";
params = params.next;
. . .
И таким образом сохраняем последовательность и желаемые типы, но это немного неудобно в работе + много операций.
Старый 02.07.2010 00:21 Cybo вне форума
Cybo
А как, например, обстоит дело с зависшими хэндлерами?
Код AS3:
oneObject.signal.add (twoObject.someMethod);
twoObject= null;
someMethod всё равно будет вызываться...
Или в системе сигналов так лучше не делать?
Хотя можно конечно делать так:
Код AS3:
oneObject.signal.add (twoObject.someMethod);
oneObject.signal.remove (twoObject.someMethod);
twoObject= null;
Хотя с обычными событиями так же дела обстоят...
Обновил(-а) Cybo 02.07.2010 в 00:49
Старый 02.07.2010 01:53 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Ну, собственно никаких изобретений в этом плане не было - все на совести пользователя, и подписка и отписка.
Старый 12.07.2010 16:15 terbooter вне форума
terbooter
Старый 12.07.2010 17:23 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Про это уже есть в 7-м комментарии...
Старый 12.07.2010 17:29 terbooter вне форума
terbooter
Старый 12.07.2010 18:56 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Там результаты тестов вообще из пальца высосаны, да и не суть важно, на самом деле... Как в итоге практика показывает, скорость раздачи или подписки на события совсем не существенна. Есть только совсем немного ситуаций, когда нужно оптимизировать (например, нужно проверять, а есть ли подписчики, и не добавлять много слушателей с выставленым приоритетом). В чем да есть проблема у нативного диспетчера, так это в том, что он использует строки как идентификаторы, нет способа удалить всех подписчиков, невозможно использовать события повторно, нельзя самому назначить target / currentTarget уже существующим классам событий, ну и остальная критика в том же ключе. Т.е. я это к тому говорю, что он "идеологически" не доделан, а по скорости, там особенно ничего не добавить, он и так вполне себе шустро работает.
Старый 12.07.2010 20:08 Котяра вне форума
Котяра
 
Аватар для Котяра
Да, сигналы мне больше понравились именно строгой типизацией, но проблема в привычках..
Кроме того, всё равно в 99 % кода придётся обрабатывать нативные события, а сигналы использовать для собственных событий, что немного неудобно - хочется или-или.
Можно, конечно, обернуть/расширить спрайты, лоадеры итп в классы с сигналами, но это опять же для проекта "вещь в себе", как только я прикручу к проекту что-нибудь внешнее - придётся или использовать события или писать обёртку..
Старый 12.07.2010 21:49 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Котяра, у сигналов строгая типизация как раз отсутствует. то есть сигнал сигналу рознь. а у событийной модели типизация строгая. то есть хэндрел может иметь только одну сигнатуру, и никакую другу.
Старый 12.07.2010 22:21 Котяра вне форума
Котяра
 
Аватар для Котяра
типизация по событию(нет в as3)
Код AS1/AS2:
// with EventDispatcher
button.addEventListener(MouseEvent.CLICK, onClick);
 
// Signal equivalent; past tense is recommended
button.clicked.add(onClicked);
типизация по хэндлеру
Код AS3:
// A Signal that will dispatch a String and an integer:
progress = new Signal(String, int);
//later:
progress.dispatch(); // will throw ArgumentError 
progress.dispatch('The Answer'); // will throw ArgumentError 
progress.dispatch('The Answer', 42.5); // will throw ArgumentError 
progress.dispatch('The Answer', 42); // will succeed
использую для примера Пеннеровский сигнал
Старый 12.07.2010 22:57 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Котяра, дык в том и проблема. я не смогу одним хендлером 20 сигналов разных споймать. что ещё хуже, мне надо знать сигнатуру каждого сигнала. ну и ещё куча проблем с target и т.д.
Обновил(-а) BlooDHounD 13.07.2010 в 00:23
Старый 12.07.2010 23:05 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
BlooDHounD: это как бы вообще не в кассу - в C# 2 вообще в принципе нет динамической типизации, но тем не менее у сигналов (событий) как правило разная запись.

Только не путаем строгую и статическую типизацию. В AS3 в принципе есть статическая типизация для функций, но она только наполовину существует. Т.е. описать функцию, как параметр нет возможности. От этого и мучения с сигналами. Задача вообще не должна решаться средствами существующими в языке. Это компилятор дожен делать, а так, это все попытки объять необъятное. Где-то возможно выиграем, где-то проиграем.
Старый 12.07.2010 23:06 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
BlooDHounD - это не плохо, это наоборот, желаемый еффект.
Старый 12.07.2010 23:18 Котяра вне форума
Котяра
 
Аватар для Котяра
Основная "строгость", которая мне нравится это то что если нет у объекта сигнала
clicked, то никак ты на него не повесишь хэндлера.
И автокомплит, конечно.. по сути это развитие событийной модели as2 с onRelease, только с назначением множествеенных хэндлеров и параметризируемыми событиями.
Если нужен target - его всегда можно передать в параметр сигнала.
Но как я писал, проблема не в том, что сигналы плохие - проблема в том что нельзя отказаться от событий в пользу сигналов полностью.. а поддерживать в коде две реализации накладно, да и просто некрасиво.
Старый 12.07.2010 23:20 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
wvxvw, ну для меня это не желаемый эффект. вот что мне делать, если придётся обрабатывать какой-нить click от 20ти объектов? создавать 20 слушателей, или подправить сигнал и передавать в него target? а если у меня доступа к исправлению сигнала? если я сам пишу библиотеку, и хочу сделать что бы она удовлетворяла всем потребностям подписки? нагородить из сигнала обычный евент?
Старый 12.07.2010 23:39 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Открой вижуал студио 2005, создай в дизайнере 20 кнопок и подпишись ко всем на событие Click.
Старый 12.07.2010 23:45 Котяра вне форума
Котяра
 
Аватар для Котяра
Ну вообще, да - таргет и куррент таргет - довольно полезные изобретения as3 (пруф?)
Ничто не мешает сделать базовые сигналы с ними, если так они нравятся. Как переделывать чужие - другой вопрос.
в том же сишарпе таргет есть, только он более логично называется sender
Код AS3:
        button1.ClickEvent += button1_OnClick;
    protected void button1_OnClick(object sender, MouseEventArgs e)
    {
        MessageBox.Show("Clicked!");
    }
Обновил(-а) Котяра 13.07.2010 в 00:04
Старый 12.07.2010 23:51 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Котяра, поправь меня, если я не правильно понял твой код:
тут e - это объект на подобие MouseEvent в АС3, но без таргет, который передан отдельно?
Старый 12.07.2010 23:54 Котяра вне форума
Котяра
 
Аватар для Котяра
да так и есть
в случае с сигналом может быть так:
Код AS3:
button.clicked = new Signal(DisplayObject,MouseEventArguments);
 
button.clicked.add(onClicked);
button.clicked.dispatch(this, new MouseEventArguments(...));
..
private function  onClicked(sender:DisplayObject, e:MouseEventArguments)
{
}
Обновил(-а) Котяра 13.07.2010 в 00:12
Старый 12.07.2010 23:55 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
то есть никто кроме меня не замечает парадокса?
Старый 12.07.2010 23:57 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Ну, близко, но не совсем, их можно передать несколько и чего угодно, не обязательно наследоваться от EventArgs, кроме того, можно вообще не передавать, это дело добровольное. Просто так принято во фреймворке.
Старый 13.07.2010 00:03 Котяра вне форума
Котяра
 
Аватар для Котяра
MouseEventArguments - просто обёртка для большого количества мышиных данных.
очень часто достаточно одного sender.
Старый 13.07.2010 00:20 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
а что есть в обычном евенте, кроме таргет? ну то есть, получается, что таргет - это круто и он нужен. поэтому мы фигачим его всюду. а так как событие дофига, мы их оборачиваем в класс. получаем тот же евент, только вид с боку )
Старый 13.07.2010 00:25 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
wvxvw, забавно. так принято...
Старый 13.07.2010 00:25 Котяра вне форума
Котяра
 
Аватар для Котяра
да, ничего сверхреволюционного нет, кроме основного аргумента:
Цитата:
Типы "событий" заранее известны, никаких "непредвиденых событий" объекты диспатчить не могут. Аналогично, нельзя подписаться на несуществующее "событие".
ну и соответственно нет конфликтов строковых имён событий.
в ас2 были удобными onRelease, onMouseMove итп.. но проблема была с единчтвенностью хэндлера, делегацией хэндлеров и передачей в хэндлеры параметров. В сигналах эти проблемы решены.
Обновил(-а) Котяра 13.07.2010 в 00:31
Старый 13.07.2010 00:36 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
пнятно.
Старый 13.07.2010 00:37 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
>> забавно. так принято...
Именно так, мне попадались проекты, которые эту схему впринципе не использовали. Как бы во фреймворке просто существует возможность объявить событие как событие - это позволяет самому не перегружать операторы += и -=, ну и вообще просто будет понятно незнакомому человеку, но это не догма. Когда ты оформляешь событие, ты создаешь делегата, который описывает, что ты будешь в слушателя передавать, и цикл раздающий событие. Это немного больше в плане самостоятельной реализации, чем в AS3, но с другой стороны - все равно делается по шаблону, так что никто об этом сильно не заморачивается.

Что касается содержания аргументов (EventArgs) - у этого класса нет никаких свойств, свойства объявляют только наследники.

Кстати, из интереснын вещей, можно оверлоадить [] у EventArgs:
Код:
public object this[int i]
{
    get { return realArguments[i]; }
    set { realArguments[i] = value; }
}
И так можно передавать неограниченое количество параметров, практически, как то, что ты мне показывал с args.
Обновил(-а) wvxvw 13.07.2010 в 00:44
Старый 13.07.2010 00:42 Котяра вне форума
Котяра
 
Аватар для Котяра
ну еще один плюс - приватные события(сигналы)
Старый 13.07.2010 01:00 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
wvxvw, ничего интересного в перегрузки операторов не замечаю. к тому же rest можно в сигналах сделать и без EventArgs, на сколько я понимаю.

Котяра, приватные события?
Старый 13.07.2010 01:03 Котяра вне форума
Котяра
 
Аватар для Котяра
Просто объявляешь сигнал приватным и никакого сигнала и тем более add вне класса.. Насколько это нужно - фиг знает, сходу не придумаю, хотя для организации внутренней логики класса через сигналы, которые незачем знать остальным - можно..
Старый 13.07.2010 01:12 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Котяра, честно говоря для меня тут всё попахивает костыльным маразмом ) ты своими приватными сигналами только укрепляешь мою уверенность.
Старый 13.07.2010 01:17 Котяра вне форума
Котяра
 
Аватар для Котяра
Да почему костыли? Наоборот: устранение недостатков событийной модели ас3. Приватность событий это только один из необязательных плюсов (инкапсуляции событийной логики внутри класса).
То что это немного реализовано через костыли - недостатки ас3, как языка, а не кривизна концепции как таковой.
Старый 13.07.2010 01:48 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Котяра, я тебя не понял ) для меня тут один сплошной костыль. мне в 90% случаев нужен target. мне в 90% случаев нужно одним слушателем ловить много событий ( причём не обязательно одних и тех же ). мне в 20 процентах случаев нужны приоритеты. и мне никогда не надо приватные события. единственный недостаток это необходимость описывать метаданными события.

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

но я не настаиваю. в общем я разочарован ещё больше.
Старый 13.07.2010 02:21 Котяра вне форума
Котяра
 
Аватар для Котяра
Ладно) Насорили изрядно уже нашим триалогом тут..
но еще чуток:
Цитата:
мне в 90% случаев нужен target.
расширь один раз класс сигналов, чтобы он принимал в конструкторе sender (target) и соответственно всегда его рассылал.
Цитата:
мне в 90% случаев нужно одним слушателем ловить много событий ( причём не обязательно одних и тех же )
нормально всё ловится, а вот ловить события разных типов - это как раз костыль, но уже архитектуры..
кстати а как это с эвентами происходит?
Цитата:
public function someEventListener(e:Event)?
ничем не лучше
Код AS3:
public function someEventListener(sender:*, signalParams:*)
Цитата:
. мне в 20 процентах случаев нужны приоритеты
есть они
Цитата:
и мне никогда не надо приватные события
не надо, потому что привык обходиться без них. Можно привыкнуть работать с одними пабликами, можно работать без строгой типизацией.. это не аргумент.
Цитата:
единственный недостаток это необходимость описывать метаданными события.
вот это, как я говорил главный плюс.. если бы еще сигнатурирование функций поддерживалось ас3, было бы вообще хорошо.

Я не настаиваю, просто сигналы хорошая и зарекомендовавшая себя в с# идея.

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


ЗЫ: вот еще "для почитать"
http://flashblog.robertpenner.com/20...rned-from.html
Обновил(-а) Котяра 13.07.2010 в 02:25
Старый 13.07.2010 02:42 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Котяра, с евентами кроме как евент придти ничего не может. а вот у сигналов может быть что угодно. неизвестно количество агрументов и их тип. неужели это так не ясно?
Цитата:
Сообщение от Котяра
Можно привыкнуть работать с одними пабликами, можно работать без строгой типизацией.. это не аргумент.
ясен красен. поэтому у меня всё приватное и поэтому у меня строгая типизация.

я не понимаю почему у тебя хэндлеры паблик.
я не понимаю зачем мне распространять событие внутри класса, ведь хэндлер всегда будет один =) это идиотизм.
Старый 13.07.2010 02:57 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Котяра, с евентами кроме как евент придти ничего не может. а вот у сигналов может быть что угодно. неизвестно количество агрументов и их тип. неужели это так не ясно?
Как генерим хэндлер в addEventListener(string,func) ?
кто конкретно скажет какая сигнатура у func? только то что она принимает Эвент? А какой эвент? Маус,кастомный или еще какой? неизвестно.
Это проблема АС3 а не конкретно сигналов.
Да что такое эвент? по сути это пустой нетизированный объект с таргетом (как ты сам говорил)..
Да и тот же ФД сгенерит хэндлер конкретного сигнала на раз (при написании соответствующего несложного плагина)..

Цитата:
я не понимаю почему у тебя хэндлеры паблик.
очепятка не имеющая никакого значения
Цитата:
событие внутри класса, ведь хэндлер всегда будет один
да почему же один?
Код AS3:
button.click.add(listener1);
button.click.add(listener2);
button2.click.add(listener1);
button2.click.add(listener2);
Обновил(-а) Котяра 13.07.2010 в 02:59
Старый 13.07.2010 03:10 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
Цитата:
Да что такое эвент? по сути это пустой нетизированный объект с таргетом (как ты сам говорил)..
вот не надо меня перевирать. это вполне себе типизированный объект. я знаю как минимум его основные свойства. если я слушаю разные евенты одним слушателем, значит мне надо "наименьшее общее кратное".

сори, но в твоём примере сигнал не приватный, и к тому же бессмысленный. зачем мне подписывать 2мя методами на одно событие? -) ради фана?
Старый 13.07.2010 04:06 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Вобщем-то цель любого шаблона похожего на обзервер сводится к тому, чтобы избежать жестких ссылок. При этом, естесственно, появляется риск потерять проверку типов. Сигналы более затрантны в плане написания, но гарантируют большую безопасность в плане типизации (потому, что гарантируют тип переданых параметров), события менее безопасны (потому, что гарантируют только тип одного параметра), но более универсальны. Мне на практике никогда не нужна была такая универсальность, более того, этот самый параметр, как правило лишний, т.е. он выполняет исключительно техническую функцию передачи других параметров, т.е. если следовать правилу бритвы Оккама, от него нужно попытаться избавиться.
Старый 13.07.2010 09:40 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
wvxvw, о какой безопасности типизации вы мне тут твердите? они гарантируют ровно такую же безопасность как и события. при этом на практике, если мне эти аргументы не нужны, я буду вынужден их описывать всё равно. только вместо одного заведомо известного аргумента, мне придётся полазить по сигналу и посмотреть сигнатуру.
Старый 13.07.2010 15:30 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Нет, если ты подписался на событие, то ты вполне можешь получить совсем не то, на что подписался, если тип события случайно назвали так же, как и тот, на который ты подписался. В случае с сигналами это не возможно.
Старый 13.07.2010 15:46 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
wvxvw, почему ко мне придётся не то, на что я подписался? придёт как раз таки оно. ты видимо имеешь ввиду проблемы с баблингом ( когда 2 объекта писались 2мя неудачниками ), который в сигналах сделать вообще проблематично.
 

 


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


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