Я буду довольно конкретным здесь, так как у меня есть некоторый связанный опыт.Не все из того, что я напишу, будет применимо, но я надеюсь, что что-то сработает.
Мой 1. совет - сохранить любой код, который напрямую зависит от любой среды, как можно более «глупым».Если вы можете, рассмотрите такой код более или менее одноразовым (с точки зрения реализации, контракты API, предоставляемые клиентам, конечно, должны быть стабильными).
Сосредоточьтесь на том, что делает ваше приложение уникальным, и постарайтесь сделать его независимым от GWT.и т. д. шаблон фасада *1006* - это то, что я могу порекомендовать - держать логику для конкретного приложения позади и выставлять ее, подключая к ней слой представления, хорошо нам помогло.Если ваш бэкэнд зависит от сторонней инфраструктуры (через веб-сервисы и т. Д.), Отделите эти зависимости от вашего кода с помощью шаблона адаптера .
Я провел большую часть своего рабочего времени в течениепоследние 5 лет на создание чего-то, что во многом соответствует тому, что вы описали.Сегодня это скорее среда приложения, чем приложение - у него есть несколько различных интерфейсов браузера (WAP / стандартное веб-приложение + приложение ajax / Facebook), интерфейс для двухстороннего использования SMS и интерфейс REST / XML для толстых мобильных клиентов - BREW, iPhone, Android и Blackberry.
Когда речь заходит о фреймворках, для настойчивости мы использовали Hibernate.Все различные части кода связаны с Spring.Интерфейсы браузера были перенесены из Struts (1.x) в Wicket.Интерфейсы для SMS и мобильных клиентов построены поверх Restlet.
Использование нескольких различных структур уровня представления (таких как Wicket и Restlet в нашем случае) не было проблемой, если этот код остается скудным ибизнес-правила не допускаются (насколько это возможно).Ничто не говорит о том, что ваш интерфейс браузера должен быть упакован в ту же WAR, что и интерфейс вашего мобильного клиента - с помощью Spring вы можете легко подключить несколько веб-приложений с одним фасадом.Это было полезно для нас, особенно потому, что несколько разработчиков работали над хорошо изолированными частями приложения.
По моему мнению, попытка добиться максимального повторного использования кода на уровне представления принесла больше вреда, чем пользы.Это всегда было самой изменчивой частью нашего приложения, сверх того, что мы могли ожидать.