Model-View-Controller

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Шаблон проектирования
Модель Представление Контроллер
Model-View-Controller
MVC-Process.png
Структура:
  • Модель
  • Контроллер
  • Представление

Model–View–Controller (MVC, «Модель–Представление–Контроллер», «Модель–Вид–Контроллер») — схема разделения данных приложения, пользовательского интерфейса и управляющей логики на три отдельных компонента: модель, представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо[1]:

  • Модель (Model) предоставляет данные и реагирует на команды контроллера, изменяя своё состояние[1];
  • Представление (View) отвечает за отображение данных модели пользователю, реагируя на изменения модели[1];
  • Контроллер (Controller) интерпретирует действия пользователя, оповещая модель о необходимости изменений[1].

Впервые описана норвежцем Трюгве Ринскаугом в 1978 году[1].

История[править | править вики-текст]

Концепция MVC была описана Трюгве Реенскаугом в 1978 году[1][2], работавшим в научно-исследовательском центре «Xerox PARC» над языком программирования «Smalltalk». Позже, Стив Бурбек реализовал шаблон в «Smalltalk-80»[1][3][4].

Окончательная версия концепции MVC была опубликована лишь в 1988 году в журнале «Technology Object»[5].

Впоследствии шаблон проектирования стал эволюционировать. Например, была представлена иерархическая версия (H.M–V–C), а также M–V–A, M–V–VM[6][7][8].

Компания «Apple», после внедрения технологии «WebObjects», реализованной на «Objective-C», стала популяризировать шаблон и в вебе[источник не указан 100 дней].

Когда «WebObjects» портировали на «Java» — шаблон стал популярен и там. Более поздние фреймворки (вроде «Spring»; октябрь 2002 года) всё ещё имеют реализацию MVC[источник не указан 100 дней].

Дальнейший виток популярности привнесло развитие фреймворков, ориентированных на быструю развёртку, на языках «Python» и «Ruby» («Django» и «Rails», соответственно)[источник не указан 100 дней]. На момент 2017 года — фреймворки с MVC заняли заметные позиции, по отношению к остальным фреймворкам без этого шаблона[9].

Различия описания концепции шаблона[править | править вики-текст]

С развитием объектно-ориентированного программирования и понятия о шаблонах проектирования был создан ряд модификаций концепции MVC, которые, при реализации у разных авторов, могут отличаться от оригинальной. Так, например, Эриан Верми в 2004 году описал пример обобщённого MVC[10].

В предисловии к диссертации «Naked objects» Ричарда Поусона (Richard Pawson) Трюгве Реенскауг упоминает свою неопубликованную наиболее раннюю версию MVC, согласно которой[11]:

  • Модель относилась к «разуму» пользователя;
  • Под представлением имелся в виду редактор, позволяющий пользователю просматривать и обновлять информацию;
  • Контроллер являлся инструментом для связывания представлений воедино и применялся пользователем для решения его задач.

Назначение[править | править вики-текст]

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

  1. Для отображения модели можно использовать несколько видов, не затрагивая её реализацию (например, данные могут быть одновременно представлены в виде электронной таблицы, гистограммы и круговой диаграммы);
  2. Не затрагивая реализацию видов, можно изменить реакцию системы на действия пользователя (например: нажатие кнопки, ввод данных) — достаточно использовать другой контроллер (отредактировать существующий);
  3. Ряд разработчиков специализируется только в одной из областей: разрабатывают либо пользовательский интерфейс, либо бизнес-логику. Поэтому возможно добиться того, что разработчики бизнес-логики (модель) не будут осведомлены о том, какое представление будет использоваться.

Концепция[править | править вики-текст]

Компоненты[править | править вики-текст]

Архитектурная концепция MVC позволяет разделить программный комплекс на три отдельных компонента, которые могут быть реализованы следующим образом:

Модель[править | править вики-текст]

  • Предоставляет (представлению и контроллеру):
    • Данные;
    • Методы работы с данными (далее — опционально, в зависимости от реализации):
      • Запросы к базам данных;
      • Валидация данных (проверка на корректность);
      • Бизнес-логика (в случае «активной» модели).
  • Нуждается в следующем:
    • В представлении (т. к. не может самостоятельно демонстрировать данные и результаты их обработки);
    • В контроллере (т. к. не имеет точек взаимодействия с пользователем).
  • Может иметь множество различных представлений и контроллеров;
  • Отвечает на запросы изменением своего состояния. При этом, в модель может быть встроено автоматическое оповещение «наблюдателей» (обычно через «аппарат событий»).

Представление[править | править вики-текст]

  • Отвечает за получение необходимых данных от модели и отправку их пользователю;
  • Не обрабатывает введённые данные пользователя[источник не указан 97 дней];
  • Может влиять на состояние модели, через отправку ей сообщений.

Контроллер[править | править вики-текст]

  • Обеспечивает «связь» между пользователем и системой; контролирует и направляет:
    • Данные от пользователя к системе;
    • Реакцию системы — пользователю.
  • Использует модель и представление, для необходимого действия;
  • В случае «пассивной» модели — реализует бизнес-логику.

Функциональные возможности и расхождения[править | править вики-текст]

Поскольку архитектура MVC не имеет строгой реализации — она может быть реализована по-разному. Нет общепринятого определения, где должна располагаться бизнес-логика: в контроллере или в модели; в последнем случае — модель называется активной (содержит все бизнес-объекты, со всеми данными и функциями).

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

Также — не всегда указано, где должна находиться валидация (проверка) введённых пользователем данных. Простая валидация может встречаться даже в представлении, но чаще — в контроллере или модели.

Интернационализация и форматирование данных также не имеют чётких указаний по расположению.

Условно-обязательные модификации[править | править вики-текст]

Для реализации схемы «Model–View–Controller» используется достаточно большое число шаблонов проектирования (в зависимости от сложности архитектурного решения), основные из которых — «Наблюдатель», «Стратегия», «Компоновщик»[12]:

  • Наиболее типичная реализация — та, в которой вид отделён от модели установленным между ними протоколом взаимодействия, использующим «аппарат событий» (т.е. обозначение «событиями» ситуаций, возникающих в ходе выполнения программы, — и рассылка уведомлений о них всем тем, кто подписан на получение): при каждом особом изменении внутренних данных в модели (обозначенном как «событие»), она оповещает те зависящие от неё представления, которые на это подписаны — и представление обновляется. Так используется шаблон «Наблюдатель»;
  • При обработке реакции пользователя — представление выбирает (в зависимости от реакции) нужный контроллер, который обеспечит ту или иную связь с моделью. Для этого используется шаблон «Стратегия» или «Команда»;
  • Для возможности однотипного обращения с подобъектами сложно-составного иерархического вида — может использоваться шаблон «Компоновщик». Кроме того — могут использоваться и другие шаблоны проектирования: например, «Фабричный метод» (который позволит задать по умолчанию тип контроллера для соответствующего вида).

Наиболее частые ошибки[править | править вики-текст]

Начинающие программисты очень часто трактуют архитектуру MVC как имеющую пассивную модель: модель выступает исключительно совокупностью функций для доступа к данным, а контроллер — содержит бизнес-логику. В результате — код моделей, по факту, является средством получения данных из СУБД, а контроллер — типичным модулем, наполненным бизнес-логикой (см. «скрипт» в терминологии веб-программирования). В результате такого понимания — MVC-разработчики стали писать код, который Pádraic Brady (известный в кругах сообщества «Zend Framework») охарактеризовал как «ТТУК» («Толстые, тупые, уродливые контроллеры»; Fat Stupid Ugly Controllers):

Среднестатистический ТТУК получает данные из БД (используя уровень абстракции базы данных и делая вид, что это модель) или манипулирует, проверяет, записывает, а также передаёт данные в Представление... Такой подход стал очень популярен, потому что это похоже на классическую практику: использование отдельного php-файла для каждой страницы приложения.

"The M in MVC: Why Models are misunderstood and unappreciated?" (Pádraic Brady). Перевод.

Но в объектно-ориентированном программировании — в MVC используется активная модель (т.е. модель не только как доступ к данным и СУБД, но и бизнес-логика); также, модели могут инкапсулировать в себе другие модели. Контроллеры же, — как элементы информационной системы, — ответственны лишь за:

  • Приём запроса от пользователя;
  • Анализ запроса;
  • Выбор следующего действия системы, соответственно результатам анализа (например, передача запроса другим элементам системы).

Только в этом случае контроллер становится «тонким» и выполняет исключительно функцию связующего звена (glue layer) между отдельными компонентами информационной системы.

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

  1. 1 2 3 4 5 6 7 Обобщённый Model-View-Controller, 2007.
  2. Trygve M. H. Reenskaug/MVC XEROX PARC 1978-79
  3. Стив Бурбек [https://web.archive.org/web/20100921030808/http://www.itu.dk/courses/VOP/E2005/VOP2005E/8_mvc_krasner_and_pope.pdf A Description of the Model-View-Controller User Interface Paradigm in the Smalltalk-80 System].
  4. В. А. Савельев Программирование Приложений в Smalltalk-80™: Как использовать Model-View-Controller (MVC).
  5. A cookbook for using the model-view controller user interface paradigm in Smalltalk-80, A Description of the Model-View-Controller User Interface Paradigm in the Smalltalk-80 System (перевод В. А. Савельев)
  6. A cookbook for using the model-view controller user interface paradigm in Smalltalk-80.
  7. Стив Бурбек [https://web.archive.org/web/20100921030808/http://www.itu.dk/courses/VOP/E2005/VOP2005E/8_mvc_krasner_and_pope.pdf A Description of the Model-View-Controller User Interface Paradigm in the Smalltalk-80 System].
  8. В. А. Савельев Программирование Приложений в Smalltalk-80™: Как использовать Model-View-Controller (MVC).
  9. hotframeworks
  10. Vermeij. Arjan A Generic MVC Model in Java 2004
  11. Richard Pawson Naked objects, PhD dissertation, University of Dublin, Trinity College, 2004
  12. Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приёмы объектно-ориентированного проектирования. Паттерны проектирования 2001

Литература[править | править вики-текст]

  • Адам Фримен. ASP.NET MVC 4 с примерами на C# 5.0 для профессионалов, 4-е издание = Pro ASP.NET MVC 4, 4th edition. — М.: «Вильямс», 2013. — 688 с. — ISBN 978-5-8459-1867-3.
  • Джесс Чедвик и др. ASP.NET MVC 4: разработка реальных веб-приложений с помощью ASP.NET MVC = Programming ASP.NET MVC 4: Developing Real-World Web Applications with ASP.NET MVC. — М.: «Вильямс», 2013. — 432 с. — ISBN 978-5-8459-1841-3.
  • Сергей Рогачев. Обобщённый Model-View-Controller // rsdn.org. — 2007.

Ссылки[править | править вики-текст]