2013-02-12 3 views
6

Я создаю MVP-приложение в GWT.Мотивация для шины событий в GWT

  • Существует несколько панелей, и каждый из них виден в любое время.
  • Каждая панель имеет презентатор, и есть один AppController, который находится выше всех докладчиков.
  • Есть некоторые события уровня приложения, которые возникают внутри одного презентатора, но имеют последствия для других докладчиков.
  • Предлагаемая архитектура для этого, похоже, включает в себя Event Bus. Однако я не уверен, что вижу преимущество над чем-то более простым.
  • В частности, не было бы проще просто позволить AppController (и только AppController) подписаться на события из любого презентатора? Затем AppController может сообщить каждому докладчику, что делать, учитывая событие.
  • «Автобус событий» кажется квази-глобальной переменной. Но если вы можете выполнить одно и то же с помощью более точно определенных методов (т. Е. Методов, которые AppController вызывает для каждого презентатора), это не так предпочтительно?

Чтобы выразить свою озабоченность более точно: зачем вообще вводить автобус событий, а не просто позволять событиям «подниматься» на соответствующий уровень принятия решений? Для меня это похоже на самое простое расширение концепции MVP, и это не требует новой идеи Event Bus. Я не понимаю, к какой проблеме был подключен Event Bus.

+0

Я нашел документацию GWT для MVP запутанной. Вы можете найти его здесь - https://developers.google.com/web-toolkit/articles/mvp-architecture – SSR

+0

SSR - Спасибо. Я прочитал эту документацию, но, что интересно, в этом документе нет реальной мотивации для шины событий.Он просто говорит: «Вы захотите положиться на автобус событий», который на самом деле не проясняет ситуацию. –

ответ

8

Преимущество eventbus заключается в разделении кода.

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

На мой взгляд, eventbus - это действительно хорошая вещь, чтобы сделать код понятным и понятным.

+0

Спасибо за ваш ответ. Когда вы говорите, что альтернатива заключается в «создании диспетчера», я немного не понимаю, о чем вы говорите. Вы имеете в виду диспетчера внутри каждого докладчика, который должен знать обо всех других (подписанных) докладчиках? Я согласен, что звучит плохо. Вместо этого я имею в виду, что AppController получает события приложения, а затем просто сообщает ведущим ** делать ** вещи (используя общедоступные методы, определенные в докладчиках). В этой схеме Презентаторы не слушают события от других Ведущих. Извините, если я что-то пропустил ... –

+1

Этот подход будет работать, если у вас есть только несколько докладчиков. Но если вы думаете в более крупном масштабе, скажем, более 20 - 100 докладчиков, вам придется много логики в этом одном AppController. На самом деле этот отдельный класс должен знать всех докладчиков и должен отправлять туда события. Если вы добавите персонализированное событие к ведущему, вам также придется обновить свой AppController. –

+0

Хорошо, это звучит довольно неплохая причина. Спасибо за разъяснения. –

3

Ваш предлагаемый подход прекрасен, с одним большим недостатком: он требует кода спагетти, когда ваше приложение растет.

This presentation относится к Android, но аргументы сохраняются и для GWT.

Смотрите также this famous presentation от Google I/O 2009, которая явно говорит о том, использовать автобус событий бороться спагетти коднужно обязательно смотреть если вы еще не сделали).

Наконец, this blog post имеет дело с наблюдателя против медиатора узоров в JS: в GWT, шаблон наблюдателя реализуются с помощью обработчиков событий, тогда как шаблон посредника реализуются через шину событий. Вот tl; dr: «использовать наблюдателя« локально », внутри компонента, посредник« удаленно »между компонентами. »

+0

Спасибо, это полезно. Однако, по крайней мере, в PDF-версии презентации ввода-вывода Google (я в Эфиопии, поэтому у меня нет полосы пропускания для просмотра видео), похоже, что описанная альтернатива Event Bus - это прямая презентация, ведущий, который я согласен, становится спагетти-подобным. То, что я пытаюсь описать, не совсем так - скорее, это ситуация, когда еще есть «посредник» или «брокер», чтобы скрыть докладчиков друг от друга, но этот посредник - это часть логики (AppController), которая сидит «сверху» всех докладчиков. –

Смежные вопросы