Преимущества архитектуры GWT MVP


Я изучаю GWT и прочитал в нескольких местах, что использование архитектуры MVP лучше всего подходит для разработки приложения GWT

Я также читал, что его легко тестировать с помощью MVP ARCH.Может кто-нибудь объяснить мне, почему его легко сделать тестирование с использованием архитектуры MVP.

Кроме того, я работаю над проектом с использованием MVP, и мне кажется очень утомительным подключать представление к базе данных.Я имею в виду, что мне нужно обновить мой presenter, service, serviceAsync, servicImpl, фасады в порядке чтобы установить соединение с базой данных.

Итак, может ли кто-нибудь предоставить мне суть MVP для GWT?я был бы признателен за пару примеров.

2 7

2 ответа:

Разделение между презентером (который содержит логику) и представлением (тупая оболочка вокруг элементов управления пользовательского интерфейса) позволяет:

  • Напишите модульные тесты для докладчиков, которые могут выполняться без использования соответствующей среды (рабочий стол, браузер, виджеты GWT)
  • повторное использование интерфейсной логики без привязки к определенному набору виджетов / UI framework
Последний вариант использования встречается редко, поэтому давайте сосредоточимся на пригодности модели MVP для автоматизированного программного тестирования. С собой команда разработчиков это часто принимает форму непрерывного цикла сборки / тестирования с использованием Hudson (или аналогичного) на обезглавленном сервере, где нецелесообразно открывать веб-браузер, создавать элементы управления и т. д. каждый раз, когда выполняется тест.

Типичное использование 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 .

Ура! Марк