GWT, MVP и UIBinding - как получить лучшее из всех миров - PullRequest
9 голосов
/ 15 марта 2010

С MVP вы обычно связываете представление (UI) с Presenter в Presenter. Однако с последней версией GWT, особенно с UIBinding, вы можете делать следующее в представлении:

@UiHandler("loginButton")
void onAboutClicked(ClickEvent event) 
{
    // my login code
}

Который в основном обменивает много анонимного внутреннего кода класса на некоторый быстрый код аннотации. Очень хорошо!! Проблема в том, что этот код отображается, а не ведущий ...

Так что я подумал:

@UiHandler("loginButton")
void onAboutClicked(ClickEvent event) 
{
    myPresenter.onAboutClicked(...);
}

Но есть несколько проблем с этим подходом. Самое главное, вы стираете грани между View и Presenter. Кто выполняет привязку, в некоторых случаях это представление, в других - презентатор (привязка к событиям, которых нет в текущем представлении, но которые необходимо присоединить - например, общесистемное событие обновления).

Вы по-прежнему получаете преимущество от возможности модульного тестирования своего докладчика, но какой ценой. Ответственность теперь грязная. Например, привязка иногда выполняется в представлении, а иногда - на уровне докладчика. Я вижу, как со временем код впадает во все виды хаоса.

Я также думал о том, чтобы расширить Presenter для View, чтобы вы могли сделать это в View. Проблема здесь в том, что вы теряете способность докладчика запускать стандартные модульные тесты! Это серьезная проблема. Это и линии снова становятся размытыми.

Итак, мой вопрос, есть ли у кого-нибудь хороший способ воспользоваться аннотацией UIBinding в шаблоне MVP, не размывая линии и не теряя преимущества шаблона MVP?

Ответы [ 5 ]

9 голосов
/ 15 марта 2010

Я склонен использовать подход @UiHandler только тогда, когда обработчик выполняет специфические для вида вещи, такие как добавление имен стилей и т. Д. В других целях (добавление проверки и т. Д.) Я придерживаюсь старого подхода добавления соответствующих обработчиков. в докладчике.
Я бы рекомендовал прочитать одну из многочисленных тем в GWT Google Group о MVP и UiBinder, такую ​​как this .

4 голосов
/ 15 марта 2010

Если честно, я не очень часто использую аннотацию @UiHandler, потому что, как вы сказали, она начинает стирать грани между View и Presenter. Это совершенно нормально для использования, и это отличный способ, если вам не особенно важно придерживаться шаблона.

Маршрут presenter.onAboutClicked(), безусловно, является опцией, но тогда вам также следует сначала определить обработчик в презентаторе.

1 голос
/ 29 марта 2010

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

gwt 2.0.x - большое улучшение gwt 1.x, но я все еще верю, что у Google есть какой-то путь к их документации и руководству, так как, как мы видели с uibinder и mvp, это многое оставляет для воображения о том, как заставить вещи работать.

надеюсь, что ссылка немного затеняет то, что вам нужно.

0 голосов
/ 13 февраля 2013

Часто бывает полезно, чтобы представление делегировало некоторые из своих действий докладчику, используя шаблон, который иногда называют «контролирующим контроллером».

Google также отстаивал это как хороший способ получить выгодуиз хорошей аннотации @UiHandler в вашем распоряжении, когда вы используете! UiBinder.Основное отличие от исходного шаблона презентатора состоит в том, что представление сохраняет ссылку обратно на презентатора, чтобы вызывать некоторые из его методов, вместо того, чтобы презентатор регистрировал обратные вызовы для представления.

https://github.com/ArcBees/GWTP/wiki/UiHandlers

0 голосов
/ 24 августа 2012

При использовании шаблона MVP ваш интерфейс SomeView должен иметь определенный внутренний интерфейс Presenter, который, в свою очередь, реализуется вашим докладчиком (класс Activity). Так что в представлении сделайте следующее:

interface SomeView extends IsWidget
   public interface Presenter{
          ...all the methods
          public void doSomeAction(SomeView view);
   }

  ...view methods
}

теперь в классе SomeViewImpl, прикрепите обработчик

@UiHandler("some_button")
void onClickSomeButton(ClickEvent e){
     // call the presenter method (you have access to it in the ViewImpl class
     presenter.doSomeAction(this);
}

Выглядит немного длинно, но шаблон отлично работает.

...