Re[10]: Событийно ориентированное программирование
От: _NN_  
Дата: 23.07.14 21:44
Оценка:
Здравствуйте, Jack128, Вы писали:

J>ну ты сохранил подписку в глобальной переменной. точно так же и лямбду можно сохранить. в чем отличие ?


Лямбду легко забыть сохранить и каждый раз создавать новую локальную переменную. Реальный баг
А вот объект подписки не сохранив не отпишешься.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Событийно ориентированное программирование
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.07.14 01:53
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Кто же все таки посчитал, что первый подход лучше ?


Хейльсберг. Он в добавок еще и с делегатами накосячил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Событийно ориентированное программирование
От: landerhigh Пират  
Дата: 30.07.14 03:12
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Даже в старом WinAPI был второй вариант.

_NN>Кто же все таки посчитал, что первый подход лучше ?

логически, вариант с

MySubscription = SomeEvent.Subscribe(MyHandler)
MySubscription.Dispose();


абсолютно эквивалентен

SomeEvent.Subscribe(MyHandler)
SomeEvent.Unsubscribe(MyHandler);


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

Вариант с объектами-подписками означает, что подписки надо где-то хранить. Это автоматически влечет проблемы с подписчиками, желающими остаться инвариантами и/или подписываемые к более чем одному источнику. Причем, не стоит забывать, что очень часто, если не сказать "обычно", подписчик даже и не знает, что его подписали-отписали. В таких случаях явный

SubjectOne.Unsubscribe(Handler);
SubjectX.Unsubscribe(Handler);


очевидно предпочтительнее манипуляций с объектами-подписками, особенно если отписаться нужно не от всех источников.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.