qtuz
@qtuz

Почему в системах событий по паттерну «Издатель-подписчик» используются строки для идентификации событий?

Почти во всех реализациях системы событий по паттерну "Издатель-подписчик" на Javascript (и не только) идентификация события происходит через уникальную строку:

// публикация события
dispatcher.publish('user.profile.updated', {data: profileData});

// подписка на событие
dispatcher.subscribe('user.profile.updated', function(data) { console.log(data) });


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

class UserProfileUpdateEvent extends Event {...}

// публикация
dispatcher.publish(new UserProfileUpdateEvent(profileData));

// подписка
dispatcher.subscribe(UserProfileUpdateEvent, function(event) { console.log(event.data); });


При таком подходе у события появляется сигнатура и чёткая связь с передаваемыми данными. Такие события можно наследовать друг от друга и фильтровать по instanceof. К тому же вводится единственно возможный способ публикации - если событию необходимы данные и они не передались, будет брошено исключение.
Вопрос скорее теоретический, но пока я вижу в таком подходе только плюсы. Необходимость следить за уникальной строкой имени события мне кажется жутко неудобной.
  • Вопрос задан
  • 590 просмотров
Решения вопроса 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Потому что связь подписчиков с событием осуществляется путем помещения массива функций-обработчиков в хэш под ключом, который является именем события (или канала, если речь о pubsub). Это самый простой и очевидный механизм. С появлением Map из ES2015 ключом может служить любой объект, не только строка.

Один из способов избавиться от т.н. «stringly typed» кода — использовать конструкции типа
chrome.browserAction.onClicked.addListener(function callback)
, как сделано в хромовских расширениях.

Я полагаю, ваш подход имеет право на жизнь (и мне он нравится даже больше гуглохромовского). Но, боюсь, широкого распространения он не получит.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы