Почти во всех реализациях системы событий по паттерну "Издатель-подписчик" на 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
. К тому же вводится единственно возможный способ публикации - если событию необходимы данные и они не передались, будет брошено исключение.
Вопрос скорее теоретический, но пока я вижу в таком подходе только плюсы. Необходимость следить за уникальной строкой имени события мне кажется жутко неудобной.