Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5: Новые возможности.

  Все выпуски  

Шаблон проектирования MVC


Вниманию читателей!

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

С предыдущими выпусками Вы можете ознакомиться:

  1. в архиве рассылки (оригиналы выпусков);
  2. на сайте рассылки (исправленные и дополненные версии).

Кроме того, для чтения в онлайне доступен сборник статей, составленный на основе выпусков рассылки.

# # #

Вы также можете подписаться на рассылку "PHP 5 для начинающих".

PHP 5: Новые возможности.

В предлагаемом материале рассмотрены следующие положения:

ооновные свойства шаблона проектирования MVC;
три составляющих его слоя;
их взаимодействие между собой и с внешней средой;
отличительные особенности реализации веб приложений;
преимущества шаблона.

Шаблон проектирования MVC (Model-View-Controller) был разработан еще в конце 70-х и впервые применен в языке Smalltalk-80 для реализации графического пользовательского интерфейса [2][4]. С тех пор этот шаблон широко используется при разработке программного обеспечения и веб приложений.

Суть предложенного новшества заключается в выделении в проекте приложения трех самостоятельных, но взаимодействующих между собой, слоев (layers) - модели данных, ее экранной презентации и логики управления. Ранее приложения организовывались таким образом, что все эти слои пересекались друг с другом, образуя единую, сравнительно однородную, структуру [2].

[Замечание]Замечание

Строго говоря, обсуждаемый шаблон, предлагая решение по организации всего приложения, относится к так называемым архитектурным шаблонам (наряду с родственным шаблоном Presentation-Abstraction-Control и общеизвестной архитектурой клиент-сервер (Client-Server)) [1].

С другой стороны, с учетом использования шаблоном MVC целого ряда других, более простых шаблонов проектирования, можно говорить о нем как о сборном, агрегированном, шаблоне (aggregate design pattern) [3].

В объектно-ориентированном приложении каждому из слоев соответствует свой класс или, чаще, набор классов.

Модель данных представляет собой слой приложения, объекты которого манипулируют первичными, "сырыми" (raw), данными. К таким манипуляциям относятся не только операции по извлечению и записи информации (которая может храниться, например, в базе данных), но и ее первичная обработка (подсчет суммарных значений, сортировка, фильтрация и т. п.).

[Замечание]Замечание

В данном контексте в оригинальных источниках часто употребляется понятие домена: domain model [4], domain layer [1] и т . п. Здесь под доменом подразумевается принадлежащее приложению пространство данных.

Модель данных должна уведомлять о произошедших изменениях (например, о появлении новых данных) презентационный слой, а также отвечать на его запросы. В то же время, она сама не должна обладать возможностями для отображения данных и/или взаимодействия с пользователем.

Объекты этого слоя полностью отвечают за презентацию (отображение) в том или ином виде информации, запрошенной у модели данных. Такие запросы должны производиться в режиме "только чтение" (read-only) и ни в коем случае не менять первичные данные.

[Замечание]Замечание

В более широком смысле можно говорить о выводе информации, поскольку она может не всегда подвергаться непосредственной визуализации (например, при выводе в формате XML для передачи другому приложению).

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

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

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

Например, пользователь может, нажимая на определенные кнопки, выбрать предпочитаемое отображение (таблица, диаграмма), либо, воспользовавшись полями для ввода, добавить новые данные или отредактировать существующие.

Взаимодействие MVC приложения показано на Рисунок 1.1, «Схема взаимодействия MVC приложения».

Как видно на рисунке, инициированное пользователем событие обрабатывается контроллером, который, в зависимости от характера события, может послать управляющий сигнал презентационному слою и/или обновить модель данных.

Модель взаимодействует с базой данных (чтение/запись), а также, при изменении данных, посылает соответствующий сигнал презентационному слою.

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

[Замечание]Замечание

Контроллер и презентационный слой образуют классический пользовательский интерфейс (User Interface - UI) в традиционном его понимании. Или, что ближе к истине, классический пользовательский интерфейс в шаблоне MVC распадается на два слоя - управляющий и презентационный.


[Замечание]Замечание

Конкретные воплощения шаблона MVC могут отличаться от приведенной схемы в некоторых деталях. Так, например, в оригинальной реализации (Smalltalk-80) задача обновления модели данных возлагалась на презентационный слой, а не на контроллер [5].

Особенности взаимодействия веб приложения показаны на Рисунок 1.2, «Схема взаимодействия MVC веб приложения».

Как видно на рисунке, основное отличие взаимодействия приложения на основе MVC с пользователем состоит в способе передачи событий - посредством HTTP запроса (HTTP Request), а также получения пользователем отображения - посредством HTTP ответа (HTTP Response). И запрос, и ответ передаются через соответствующего Интернет-провайдера (ISP).

Для веб приложений наиболее характерным является отображение в виде (X)HTML страниц, которые формируются презентационным слоем либо на основе (X)HTML шаблонов, либо самостоятельно генерируются на лету.


>

Разделение приложения на три самостоятельных слоя позволяет вносить изменения в один из слоев, не затрагивая другие. Это значительно облегчает разработку и делает ее более эффективной. Каждым слоем может заниматься отдельная команда разработчиков, при необходимости добавить новый вид или изменить обработку пользовательских действий больше не нужно переписывать все приложение, ошибки теперь легко локализовать в пределах одного слоя - продолжать в таком же духе можно еще долго.

Код становится понятнее, равно как и взаимоотношения между отдельными слоями и объектами; следовательно, приложение легче разрабатывать, отлаживать и сопровождать. Открываются возможности для повторного использования кода.

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

Результатом всех этих преимуществ явилось широкое использование шаблона MVC в практике разработки программного обеспечения, в том числе, веб приложений. Тем более, что на сегодняшний день доступно большое число разного рода библиотек и рабочих оболочек, в которых уже реализованы все необходимые классы шаблона. Разработчику остается лишь использовать их для построения собственного приложения.

Предположим, что для разработки приложения на основе шаблона MVC используются классы Model, View и Controller.

  1. В каком из классов следует организовать вывод элементов, генерирующих события в ответ на те или иные действия пользователя (меню, кнопки, поля ввода и пр.)?

  2. В каком из классов следует реализовать метод fetch, который обеспечивал бы получение информации из базы данных?

  3. Какие замечания можно выдвинуть по поводу архитектуры приложения на основании приведенных ниже фрагментов кода?

    
    <?php
    
    $controller = new Controller;
    
    $controller->run();
    
    ?>
                    
    >?php
    
    class Controller {
        public function run()
        {
            $view = new View;
    
            while (true) {
                if ($event = $this->handleEvent()) {
                    $view->update($event->data);
                }
            }
        }
    }
    
    ?>
                    
    <?php
    
    class View {
        public function update($data)
        {
            $model = new Model;
            $model->data = $data;
        }
    }
    
    ?>
                    

«Ответы и решения к Глава 1, Шаблон проектирования MVC»

Created with DocBook


В избранное