Преимущества архитектуры GWT MVP
Я изучаю GWT и прочитал в нескольких местах, что использование архитектуры MVP лучше всего подходит для разработки приложения GWT
Я также читал, что его легко тестировать с помощью MVP ARCH.Может кто-нибудь объяснить мне, почему его легко сделать тестирование с использованием архитектуры MVP.
Кроме того, я работаю над проектом с использованием MVP, и мне кажется очень утомительным подключать представление к базе данных.Я имею в виду, что мне нужно обновить мой presenter, service, serviceAsync, servicImpl, фасады в порядке чтобы установить соединение с базой данных.
Итак, может ли кто-нибудь предоставить мне суть MVP для GWT?я был бы признателен за пару примеров.
2 ответа:
Разделение между презентером (который содержит логику) и представлением (тупая оболочка вокруг элементов управления пользовательского интерфейса) позволяет:
Последний вариант использования встречается редко, поэтому давайте сосредоточимся на пригодности модели MVP для автоматизированного программного тестирования. С собой команда разработчиков это часто принимает форму непрерывного цикла сборки / тестирования с использованием Hudson (или аналогичного) на обезглавленном сервере, где нецелесообразно открывать веб-браузер, создавать элементы управления и т. д. каждый раз, когда выполняется тест.
- Напишите модульные тесты для докладчиков, которые могут выполняться без использования соответствующей среды (рабочий стол, браузер, виджеты GWT)
- повторное использование интерфейсной логики без привязки к определенному набору виджетов / UI framework
Типичное использование MVP+GWT заключается в том, что представления реализуют интерфейс, предоставляемый презентером, и часто этот интерфейс определяется в терминах других универсальных интерфейсов. Вот очень простой презентатор, который увеличивает числовую метку при нажатии кнопки - обратите внимание, что вместо прямого представления TextBox и Button представление возвращает общиеhastext иhasclickhandlers экземпляры:
public class ButtonClickPresenter { public interface View { HasText currentValue(); HasClickHandlers incrementButton(); } private final View myView; private int currentValue = 0; public ButtonClickPresenter(View myView) { this.myView = myView; this.myView.currentValue().setText("0"); this.bind(); // for the sake of demonstration } public void bind() { this.myView.incrementButton.addClickHandler( @Override new ClickHandler() { void onClick(ClickEvent event) { currentValue ++; myView.currentValue().setText( Integer.toString(currentValue)); } }); } }
" реальное " представление возвращает виджеты пользовательского интерфейса (созданные с помощью UiBinder в этом примере):
public class ButtonClickView implements ButtonClickPresenter.View { // ... skipped UiBinder initialisation ... @UiField Label currentValueLabel; @UiField Button incrementButton; @Override public HasText currentValue() { return currentValueLabel; } @Override public HasClickHandlers incrementButton() { return incrementButton; } // ... etc ... }
В то время как модульные тесты создают фиктивную реализацию (или используют Mockito, EasyMock и др.) и, таким образом, не требуют каких-либо компонентов пользовательского интерфейса:
public class ButtonClickPresenterTest { ButtonClickPresenter presenter; ClickHandler currentHandler; String currentText; @Before public void setUp() { presenter = new ButtonClickPresenter( // dummy view - just stores label text in a String and // keeps track of the Presenter's click handler new ButtonClickPresenter.View() { @Override public HasText currentValue() { return new HasText() { @Override public String getText() { return currentText; } @Override public void setText(String text) { currentText = text; } }; } @Override public HasClickHandlers incrementButton() { return new HasClickHandlers() { @Override public HandlerRegistration addClickHandler(ClickHandler handler) { currentHandler = handler; } }; } }); } @Test public void testIncrement() { // initial value assertEquals("0", currentText); // clicking the button should increment the number currentHandler.onClick(null); assertEquals("1", currentText); } }
Что касается вашего следующего абзаца: ваши взгляды вообще не должно быть подключения к базе данных! Ведущий должен запросить данные через сервис / ServiceAsync (или абстракцию, такую как gwt-dispatch или gwt-platform), а затем вызвать методы представления для заполнения пользовательского интерфейса.
Кстати, эти последние две ссылки (наряду с GWT-presenter ) являются хорошим началом, если вы ищете примеры кода GWT MVP - в сочетании с Google GIN они обеспечивают рамки для связывания всего этого вместе.Имея сказав Все это, я согласен-комбинация GWT+MVP+Java может быть тяжелой работой и чрезвычайно многословной (я рад, что мне не приходится много работать с ней в эти дни). Альтернатива, однако, еще менее привлекательна: непроверяемый, недостижимый шарик спагетти...
Возможно, вы захотите взглянуть на пример приложения gwt-платформы, опубликованный здесь - > http://uptick.com.au/content/serendipity-working-gwt-platform-and-smartgwt .
Ура! Марк