LINUX.ORG.RU

[JavaScript] Application Design Patterns

 


0

0

Пишу под 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 и вообще, насколько платформа поддерживает написание больших приложение с нетривиальной логикой.



Последнее исправление: BobiKK (всего исправлений: 1)

я один прочитал это, как не могу спрятать несколько дивов жабаскриптом?
в чем собственно проблема?

yltsrc
()
Ответ на: комментарий от yltsrc

По-другому, кто должен прятать/показывать div'ы? PageController? Окей, он знает какой ему нужен view, какой див показывать. Но он не знает, какой див ему скрыть. Устанавливать глобально для всего приложения какой див сейчас показывается?

BobiKK
() автор топика

> Можно ли решить эти проблемы в рамках MVC?

Нет, если та самая «туча» будет существовать сама по себе в отрыве от.

LamerOk ★★★★★
()
Ответ на: комментарий от BobiKK

> Но он не знает, какой див ему скрыть. Устанавливать глобально для всего приложения какой див сейчас показывается?

Твоё «приложение» и есть одинокий, грустный PageController.

LamerOk ★★★★★
()

>Писался простенький клиент, но постпенно он начал обрастать функционалом, а архитектура это не позволяла. Нужно было полностью переписывать приложение.

Это вполне нормально.

SV0L0CH
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.