понедельник, 30 марта 2009 г.

Проект vbsx. Наброски архитектуры.

Постановка задачи

Ниже будет рассмотрена вольная интерпретация архитектуры MVC (Модель-вид-контроллер), применительно к скрипту блога. Сам блог ещё не существует, а его создание предполагается начать от уровня представления. Здесь описывается конкретный подход к реализации взаимодействия между сервером и собственно страницей (в браузере) с применением технологии Ajax. Будут рассмотрены основные сценарии.

1. Серверная сторона

Скрипт блога может быть реализован на любом языке. На сервер возлагается ряд обязанностей по поддержке двух уровней - модели и контроллера.

1.1 Модель


Модель реализует работу с базой данных, предоставляет элементарные действия по включению, чтению, изменению экземпляров сущностей.
Предметная область включает (для рассматриваемого случая): сообщение (заголовок, тело, другие поля); комментарий (тело). Сообщение имеет некоторое количество комментариев.

1.2 Контроллер


Контроллер рассматривается как диспетчер, принимающий запросы и формирующий ответы. Каждый запрос (за исключением некоторых) трансформируется в отклик, который содержит блок данных. То есть он не формирует всю страницу целиком, а отсылает порциями. Эти порции информации уже на уровне представления распределяются по странице (c использованием JavaScript). Отмечу, что блоки информации, отсылаемые клиенту даются в HTML-нотации, поэтому происходит некоторая подмена понятий. Контроллер, который использовал бы XML-нотацию или JSON был бы полноценным контроллером. А так... В общем выбран путь наименьшего сопротивления, так как проект не ориентируется на архитектурную эволюцию и конечную универсальность.

Кроме того, контроллер формирует два полных представления (это тот самый случай исключения): страницу блога (состоящую из полнотекстовых сообщений) и страницу сообщения (которая, помимо самой записи, включает список комментариев).

2. Уровень представления


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

2.1 Технология Ajax


Ajax именно этим и занимается. Выбор фреймворка не принципиален (я использую prototype). На уровне представления необходимо реализовать ряд операций, которые завязаны на отправке запросов.

2.2 Операции

Создание
Сообщение - createPost()
+ Запрос формы под новое сообщение - getFormForNewPost()
Комментарий - createComment()
Чтение
Список сообщений - getPosts()
Сообщение - getPost(post_id)
Список комментариев - getComments()
Обновление
Сообщение - updatePost(post_id)
+ Запрос формы, содержащей сообщение - getFormForPost(post_id)
Удаление
Сообщение - deletePost(post_id)
Комментарий - deleteComment(comment_id)

2.3 Структура страницы и сфера ответственности методов


Примерная структура страницы для сообщений (стрелкой показано, какая функция заполняет/изменяет блок; буквой "x" обозначается идентификатор сообщения):

← getFormForNewPost()← getPosts(), createPost()← getPost(post_id), deletePost(post_id)← getFormForPost(post_id)← updatePost(post_id)

Фрагмент структуры для комментариев:

← getComments(), createComment()← deleteComment(comment_id)

3. Требования к уровню контроллера


Контроллер должен иметь соответствующие функции, которые возвращают блоки. А именно: нужно однозначно определить адреса этих функций:

// postsvar url_posts_read = ''; // скрипт получения всех постов блогаvar url_post_create = ''; // скрипт создания блока сообщения (+ передача ему атрибутов нового сообщения)var url_post_read = ''; // скрипт получения блока сообщения (требуется идентификатор записи)var url_post_update = ''; // скрипт редактирования сообщения (+ передача изменённых атрибутов сообщения)var url_post_delete = ''; // скрипт удаления сообщения (требуется идентификатор записи)var url_post_form = ''; // скрипт получения формы сообщения (атрибут new=1 создаётся для принятия пустой формы; атрибут pid=x - для заполненной формы)
// commentsvar url_comments_read = ''; // скрипт получения всех комментариев для сообщения (требуется идентификатор записи)var url_comment_create = ''; // скрипт создания нового комментария (+ передача атрибутов комментария)var url_comment_delete = ''; // скрипт удаления комментария (требуется запрос с идентификатором комментария)var url_comment_form = ''; // скрипт получения формы комментария

Комментариев нет: