Что вы посоветуете для разработки приложений GWT? MVC, MVP или специальное решение для обмена сообщениями? - PullRequest
25 голосов
/ 05 августа 2009

Я только начал новый проект GWT для клиента, и мне интересно услышать, как люди знакомятся с различными архитектурами GWT MVC. В недавнем проекте я использовал как GXT MVC , так и специальное решение для обмена сообщениями (на основе Appcelerator's MQ ). GXT MVC работал нормально, но для GWT это казалось излишним, и было трудно работать с историей браузера. Я слышал о PureMVC и GWTiger , но никогда не использовал их. Наше специальное решение MQ работало довольно хорошо, но затрудняло тестирование компонентов с помощью JUnit.

Кроме того, я слышал, что Google Wave (приложение GWT) написано с использованием шаблона Model-View-Presenter. образец MVP-приложения был недавно опубликован, но, глядя на код, он не кажется настолько интуитивным.

Если бы вы создавали новое приложение GWT, какую архитектуру вы бы использовали? Какие плюсы и минусы на ваш выбор?

Спасибо

Мэтт

Ответы [ 5 ]

17 голосов
/ 04 января 2010

Стоит отметить, что Google наконец-то написал учебник по проектированию с использованием архитектуры mvp. В нем разъясняются многие элементы из выступления Google I / O, перечисленных выше. Возьми лок: https://developers.google.com/web-toolkit/articles/mvp-architecture

11 голосов
/ 06 августа 2009

Я рад, что этот вопрос был задан, потому что GWT отчаянно нужен рельсовый способ структурирования приложения. Простой подход, основанный на передовом опыте, который будет работать для 90% всех вариантов использования и обеспечивает очень простую тестируемость.

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

Мое решение состояло в следующем:

  • интерфейс для виджета, определяющий методы управления визуальным оформлением
  • реализующий класс, который может быть Composite или использовать внешнюю библиотеку виджетов
  • центральный Presenter для экрана, на котором размещено N представлений, состоящих из M виджетов
  • центральная модель на экран, которая содержит данные, связанные с текущим визуальным оформлением
  • универсальные классы слушателей, такие как "SourcesAddEvents [CustomerDTO]" (редактору здесь не нравятся реальные символы для обобщений java, поэтому я использовал квадратные скобки), потому что в противном случае у вас будет много одинаковых интерфейсов, которые отличаются только типом

Представления получают ссылку на докладчика в качестве параметра конструктора, поэтому они могут инициализировать свои события с докладчиком. Докладчик будет обрабатывать эти события и уведомлять другие виджеты / представления и / или вызывать gwt-rpc, который в случае успеха помещает свой результат в модель. Модель имеет типичный механизм прослушивания изменения свойства «Property [List [String]] names = ....», который зарегистрирован докладчиком, так что обновление модели по запросу gwt-rpc распространяется на все представления / виджеты, которые заинтересованы.

С этим appraoch я получил очень легкую тестируемость с EasyMock для моих AsynInterfaces. Я также получил возможность легко обмениваться реализацией представления / виджета, потому что все, что мне нужно было переписать, это код, который уведомлял докладчика о каком-либо событии - независимо от базового виджета (кнопки, ссылки и т. Д.).

Проблемы с моим подходом:

  • Моя текущая реализация затрудняет синхронизацию значений данных между центральными моделями разных экранов. Скажем, у вас есть экран с набором категорий и другой экран, позволяющий добавлять / редактировать эти элементы. В настоящее время очень трудно распространять эти события изменения по границам экранов, потому что значения кэшируются в этих моделях, и трудно определить, являются ли некоторые вещи грязными (было бы легко в традиционном web1.0-html сценарий типа «тупой терминал» с декларативным кэшированием на стороне сервера.
  • Параметры конструктора представлений обеспечивают супер-простое тестирование, но без солидной структуры Dependency-Injection, внутри "onModuleLoad ()" будет некоторый UGLY код фабрики / настройки. В то время, когда я начал это, я не знал о GIN Google, поэтому, когда я произвожу рефакторинг своего приложения, я буду использовать это, чтобы избавиться от этого шаблона. Интересным примером здесь является игра «HigherLower» внутри GIN-Trunk.
  • В первый раз я неправильно понял историю, поэтому сложно перемещаться из одной части моего приложения в другую. Мой подход не знает истории, которая является серьезным спадом.

Мои решения этих проблем:

  • Используйте GIN для удаления шаблона настройки, который трудно обслуживать
  • При переходе от Gwt-Ext к GXT используйте его инфраструктуру MVC в качестве EventBus для подключения / отсоединения модульных экранов, чтобы избежать проблем с кэшированием / синхронизацией
  • Подумайте о какой-то абстракции "Place", как Рэй Райан описал в своем выступлении на I / O 09, которая устраняет разрыв между событиями между GXT-MVC и GWTs-Hitory
  • Использование MVP для виджетов для изоляции доступа к данным

Резюме:

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

Поэтому я предлагаю многоуровневый подход, который объединяет эти три элемента, так как я считаю, что решение "one-event-mvp-system" не сработает. Навигация / Прикрепление экрана / Доступ к данным - это три разные задачи, и в последующие месяцы я проведу рефакторинг своего приложения (переход на GXT), чтобы использовать все три структуры событий для каждой проблемы отдельно (лучший инструмент для работы). Все три элемента не должны быть осведомлены друг о друге. Я знаю, что мое решение применимо только к GXT-проектам.

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

7 голосов
/ 06 августа 2009

Вот недавняя презентация Google IO по архитектуре вашего GWT-приложения .

Наслаждайтесь.

-JP

3 голосов
/ 13 апреля 2010

Если вы заинтересованы в использовании архитектуры MVP, вы можете взглянуть на GWTP: http://code.google.com/p/gwt-platform/. Это среда MVP с открытым исходным кодом, над которой я работаю, которая поддерживает множество полезных функций GWT, включая разделение кода и управление историей, с помощью простого API на основе аннотаций. Это совсем недавно, но уже используется в ряде проектов.

1 голос
/ 20 августа 2009

Вы должны взглянуть на GWT Portlets . Мы разработали GWT Portlets Framework, работая над большим приложением HR Portal, и теперь оно бесплатное и с открытым исходным кодом. С веб-сайта GWT Portlets (размещено в коде Google):

Модель программирования чем-то похожа на написание портлетов JSR168 для сервера портала (Liferay, JBoss Portal и т. Д.). «Портал» - это ваше приложение, созданное с использованием инфраструктуры портлетов GWT в качестве библиотеки. Функциональные возможности приложения разрабатываются в виде слабо связанных портлетов, каждый из которых имеет дополнительный DataProvider на стороне сервера.

Каждый портлет знает, как преобразовать свое состояние в сериализуемый подкласс PortletFactory (шаблон momento / DTO / factory), позволяющий реализовать важные функции:

  • Операции CRUD обрабатываются одним GWT RPC для всех портлетов
  • Макет портлетов на «странице» может быть представлен в виде дерева WidgetFactory (интерфейс, реализованный PortletFactory)
  • Деревья WidgetFactory могут быть сериализованы и перенаправлены в / из XML на сервере для хранения макетов GUI (или «страниц») в файлах XML-страниц

Другие важные особенности фреймворка перечислены ниже:

  • Страницы могут быть отредактированы в браузере во время выполнения (разработчиками и / или пользователями) с помощью редактора макета фреймворка
  • Портлеты расположены абсолютно, поэтому можно использовать области прокрутки
  • Портлеты можно настраивать, указывать, когда они загружаются для автоматического отображения "загрузка счетчика", и могут быть развернуты
  • Тематические виджеты, включая стилизованное диалоговое окно, замену кнопок в стиле CSS, небольшие кнопки инструментов и меню, управляемое шаблоном HTML

Портлеты GWT реализованы в коде Java и не содержат внешних библиотек Javascript. Он не навязывает какую-либо инфраструктуру на стороне сервера (например, Spring или J2EE), но спроектирован так, чтобы хорошо работать в сочетании с такими платформами.

...