Пишу под Nokia Web Widgets. Это браузер, который умеет JavaScript. Однако, существует серьезное ограничение: браузер работает только с одним единственным html файлом.
Т.о., JavaScript обязан выполнять все функции, присущие языкам/фреймворкам для десктопного программирования: получать данные, кешировать и создавать модели на их основе, контролировать и управлять «экраном» (смена текущего представления, навигация), реагировать на действия пользователей (клики по кнопочкам), общаться с системным API и вообще отображать что-то на экране.
Чтобы это дело как-то структурировать, решил использовать всем известный паттерн MVC.
С моделями, в принципе, всё довольно просто. Поскольку данные получаю/отправляю, общаясь с REST-сервисом, то нет необходимости в каких-нибудть ActiveRecords, Row Data Gateway и т.д. Достаточно реализовать модели как Transaction Scripts, которые используют враппер для общения с сервисом.
С контроллерами тоже более менее ясно. FrontController занимается поиском нужного PageController'а, который в свою очередь находит необходимую модель; определяет, какой контроллер будет вызван при нажатии «Назад»; связывает модель с представлением. Есть несколько проблем: каждому контроллеру надо сообщать, использовать старую модель или инциализировать новую (Пример: контроллер Books получает все данные о книгах и их визуализирует. Потом вызываеся контроллер AddBook, добавляется новая книга и снова вызывается Books, которому надо получить новые данные, а не использовать старые. Однако, если книга не была добавлена (пользователь нажал Back), обновлять данные нет необходимости). Помимо этого надо обновлять сами представления: изменились данные, значит надо заново их отрендерить.
Ну и Views. Если бы представления были только html разметкой, то всё было бы хорошо. Но нет, помимо этого есть ещё и куча JS-кода, который не имеет отношения к бизнесс логике, а используется для позиционирования элементов, рисования кнопочек, менюшек, управления табами и т.д. Помимо прочего, как уже было выше сказано, существует всего один html файл. Т.е. все предствления (по краней мере их html-ая часть) должны находиться в одном файле. Можно логически разделить html-ый файл div'ами на разные представления (<div id=«books-view»>..</div>, <div id=«addbook-view»>...</div>) и, по мере необходимости, скрывать ненужные шаблоны и делать видимыми нужные. Однако, та куча js-кода изменяет разметку до неузнаваимости. В случае с Books, после того как была добавлена новая книга, надо заново рендерить «books-view». Только откуда взять первоначальный шаблон «books-view», если этот «books-view» был уже изменен до этого кучей js-кода до неузнаваемости?
Можно ли решить эти проблемы в рамках MVC? Что можно сделать с представлениями? Какие есть альтернативы MVC? Чтобы больше подошло под эти требования?
Инетерес, в принципе, академический. Писался простенький клиент, но постпенно он начал обрастать функционалом, а архитектура это не позволяла. Нужно было полностью переписывать приложение. На этой почве пошли мысли, почему бы не проанализировать, имеет ли смысл применять известные паттерны проектирования для JavaScript в рамках Nokia Web Runtime и вообще, насколько платформа поддерживает написание больших приложение с нетривиальной логикой.