Какие плюсы и минусы EventBus

Ответ

Плюсы:

  • Простота использования: легкая реализация коммуникации между компонентами
  • Гибкость: можно передавать данные между любыми частями приложения
  • Декомпозиция: уменьшает связанность компонентов

Минусы:

  • Сложность отладки: трудно отследить цепочку событий
  • Потенциальные утечки памяти: нужно явно отписываться от событий
  • Неявные зависимости: сложно понять, кто и на какие события подписан
// Пример реализации простого EventBus
class EventBus {
  constructor() {
    this.listeners = {};
  }

  on(event, callback) {
    if (!this.listeners[event]) {
      this.listeners[event] = [];
    }
    this.listeners[event].push(callback);
  }

  emit(event, data) {
    (this.listeners[event] || []).forEach(cb => cb(data));
  }

  off(event, callback) {
    this.listeners[event] = (this.listeners[event] || [])
      .filter(cb => cb !== callback);
  }
}

Лучше использовать для простых проектов или как временное решение. В крупных приложениях предпочтительнее state-менеджеры.

Ответ 18+ 🔞

Да ты послушай, что за дичь придумали, чтобы компоненты друг с другом общались! EventBus, называется. Ну, вроде как автобус, только для событий, блядь.

Плюсы, говорят, есть, да:

  • Простота, мать её: вроде как легко — нажал кнопку, событие уехало, кто-то его там поймал. Компоненты перестают друг другу в жопу смотреть напрямую.
  • Гибкость ёбаная: можно сигналы слать куда угодно, хоть на другой конец приложения. Все как будто рации получили.
  • Развязка, блядь: компоненты меньше знают друг о друге, не такие сцепленные, как вагоны.

А теперь, сука, ложка дёгтя, она же минусы:

  • Отладка — пиздец и ад: попробуй отследи, кто, кому и какую хуйню отправил. Цепочка событий — тёмный лес, ёпта. Один emit, а откликов — овердохуища.
  • Утечки памяти, зараза: если не отписаться от события, когда компонент помер, то он так и будет висеть призраком в памяти, слушая весь этот трёп. Надо за собой убирать, как в туалете.
  • Зависимости неявные, блядь: открываешь компонент, а нихуя не понятно — на какие события он подписан. Сюрпризы потом вылезают, как геморрой.
// Вот смотри, как эту штуку на коленке собрать можно
class EventBus {
  constructor() {
    this.listeners = {}; // Тут все слушатели по полочкам
  }

  // Подписаться на событие — "слушай сюда!"
  on(event, callback) {
    if (!this.listeners[event]) {
      this.listeners[event] = [];
    }
    this.listeners[event].push(callback);
  }

  // Вызвать событие — "эй, все, кто слушал 'event', вам письма!"
  emit(event, data) {
    (this.listeners[event] || []).forEach(cb => cb(data));
  }

  // Отписаться — "всё, я больше не слушаю эту хуйню"
  off(event, callback) {
    this.listeners[event] = (this.listeners[event] || [])
      .filter(cb => cb !== callback);
  }
}

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