Избавляемся от шаблона GWT MVP
Следуя документации о местах и мероприятиях + MVP, для каждой страницы мне нужно создать:
- место
- деятельность
- токенизатор (я должен реализовать логику токенизации)
- интерфейс для докладчика (действие реализует этот интерфейс)
- интерфейс для представления
- реализация представления
- связыватель пользовательского интерфейса XML для реализации представления
- узел в мапере активности приложения
- узел в модуле джина для привязки интерфейса просмотра для просмотра реализации
Я создал приложение с основными функциями (5 страниц и панель навигации), и у меня уже есть более 1500 строк кода и ~40 файлов. Я думаю, что это абсолютно невозможно, однако я ничего не нашел по решению этой проблемы. Есть пара структур (например, GWTP), которые реализуют MVP, но им также нужно такое же количество шаблонов.
Я мог бы достичь той же функциональности в ~200 строк, используя Spring MVC или Play.
Что я делаю не так и как бы вы решили это?
2 ответа
Я думаю, что это абсолютно невозможно
Я не согласен с тобой. Большое количество маленьких файлов намного удобнее в обслуживании, чем пара больших файлов. Я согласен, что GWT гораздо более многословен, чем Spring MVC:
- Вам не нужны все эти интерфейсы из-за динамической природы JSP
- JSP в случае Sppring MVC не является строго типизированным и дает вам возможность автоматически делать много вещей низкого уровня (например, привязка данных).
- И вообще ничего не делайте (нет необходимости очищать представление между запросами, представление не имеет состояния).
В случае GWT из-за строгой природы Java и представлений о состоянии вы должны сделать много дополнительной работы. Это полностью обслуживаемо (если все сделано правильно). Основным преимуществом является то, что вы можете добавить модульные тесты для уровня презентации. Из-за этого он будет более удобен для долгосрочных проектов со сложным пользовательским интерфейсом, большой базой кода и большой командой. Если это не так для вашего проекта (экраны просты, и вы не планируете добавлять модульные тесты для уровня пользовательского интерфейса), то может быть лучше:
- использовать еще одну более легкую технологию представления (например, Spring MVC).
- или упростить вашу политику (например, разрешить докладчику -> просматривать взаимодействия без интерфейсов). Обычно в этом случае вы теряете способность проводить модульное тестирование своих докладчиков. Как упомянул @Andrea Boscolo, вы можете использовать GwtMockito в качестве обходного пути для этой проблемы!
Два других преимущества интерфейсов между представлением и докладчиками:
- Вы можете легко переключать реализацию представлений (известный пример создания desctop UI -> mobile UI switch, который, к сожалению, я никогда не видел реализованным)
- Для меня это своего рода барьер, который помогает сохранить логику презентации в докладчике. Ведущий знает только о необходимых вещах. Мне нравится эта концепция. Это помогает мне писать все части в нужных местах.
Что действительно раздражает во всех этих файлах, так это то, что для настройки одного действия требуется много времени. Чтобы упростить это:
- Убедитесь, что вы используете шаблон UiBinder в Eclipse
- Более того, вы можете написать свой генератор кода, который будет принимать имя активности и пакет в качестве параметров, а затем он сгенерирует все необходимые вещи. Так что вам нужно просто изменить ActivityMapper и начать писать важную логику пользовательского интерфейса. Это сделано для моего текущего проекта и делает меня счастливым.
Другим источником шаблонов является привязка данных. Рассмотрите возможность использования редактора
Основным преимуществом использования MVP с GWT является возможность модульного тестирования ваших презентаторов изолированно с использованием простого JUnit. TestCase
вместо того, чтобы полагаться на мучительно медленно GwtTestCase
,
Другие преимущества, такие как возможность поддержки, могут быть достигнуты с помощью более простых структур проекта, таких как @Maksym Demidas.
Таким образом, реальный вопрос заключается в том, хотите ли вы / нуждаетесь в такой степени тестирования внутри вашего проекта, за счет вышеупомянутого стандартного образца. Обратите внимание, что места и действия не имеют ничего общего с MVP: вы можете использовать их для достижения MVP, но они просто касаются навигации и просмотра переходов между местами (URL
с).
Я бы действительно посоветовал вам взглянуть на недавнюю презентацию Эрика Куфлера в Google IO 2013 - Demystifying MVP and EventBus in GWT
, Это должно помочь вам определить, когда использовать MVP, а когда нет. Кроме того, взгляните на библиотеку с открытым исходным кодом, которую он выпустил, специально для GwtMockito
(т.е. тестирование логики виджета в простом JUnit TestCase
).