Модель-представление-контроллер
Модель-представление-контроллер ( MVC ) — это шаблон проектирования программного обеспечения. [1] обычно используется для разработки пользовательских интерфейсов , который делит связанную логику программы на три взаимосвязанных элемента. Эти элементы:
- модель , внутренние представления информации
- представление , интерфейс , который представляет информацию и принимает ее от пользователя
- контроллер , программное обеспечение , связывающее их. [2] [3]
Традиционно используемый для графических пользовательских интерфейсов (GUI) настольных компьютеров, этот шаблон стал популярным для разработки веб-приложений . [4] Популярные языки программирования имеют структуры MVC, которые облегчают реализацию шаблона.
История
[ редактировать ]MVC стал одним из плодотворных открытий на ранних стадиях разработки графических пользовательских интерфейсов. Он стал одним из первых подходов к описанию и реализации программных конструкций с точки зрения их ответственности . [5]
Трюгве Реенскауг создал MVC во время работы над Smalltalk -79 в качестве приглашенного ученого в Исследовательском центре Xerox в Пало-Альто (PARC) в конце 1970-х годов. [6] [7] [8] : 330 Ему нужен был шаблон, который можно было бы использовать для структурирования любой программы, в которой пользователи взаимодействуют с большим и запутанным набором данных . Его дизайн изначально состоял из четырех частей: Модель , Представление, Объект и Редактор. Обсудив это с другими разработчиками Smalltalk , он и остальная часть группы вместо этого остановились на модели, представлении и контроллере. [6]
В окончательном варианте модель чисто и интуитивно представляет некоторую часть программы. Представление — это визуальное представление модели, извлекающее данные из модели для отображения пользователю и передающее запросы туда и обратно между пользователем и моделью. Контроллер — это организационная часть пользовательского интерфейса, которая размещает и координирует несколько представлений на экране, а также принимает вводимые пользователем данные и отправляет соответствующие сообщения базовым представлениям. Эта конструкция также включает в себя редактор как специализированный контроллер, используемый для изменения определенного представления и создаваемый с помощью этого представления. [6]
Smalltalk-80 поддерживает версию MVC, развившуюся на основе этой. [6] Он предоставляет абстрактные view
и controller
классы, а также различные конкретные подклассы каждого из них, которые представляют различные общие виджеты . В этой схеме View
представляет собой некоторый способ отображения информации пользователю, а controller
представляет собой некоторый способ взаимодействия пользователя с view
. А view
также связан с объектом модели, но структура этого объекта остается на усмотрение прикладного программиста . Среда Smalltalk-80 также включает в себя «MVC Inspector», инструмент разработки для параллельного просмотра структуры заданной модели, представления и контроллера. [9]
В 1988 году статья двух бывших сотрудников PARC в «Журнале объектной технологии » (JOT) представила MVC как общую « парадигму и методологию программирования » для разработчиков Smalltalk-80. Однако их схема отличалась как от схемы Ринскауга и др., так и от схемы, представленной в справочниках Smalltalk-80. Они определили представление как охватывающее любую графическую задачу, при этом контроллер — это более абстрактный, обычно невидимый объект, который получает ввод пользователя и взаимодействует с одним или несколькими представлениями и только одной моделью. [10]
Впоследствии шаблон MVC развился, [11] породив такие варианты, как иерархическая модель-представление-контроллер (HMVC), модель-представление-адаптер (MVA), модель-представление-презентатор (MVP), модель-представление-модель представления (MVVM) и другие, которые адаптировали MVC к различным контексты.
Использование шаблона MVC в веб-приложениях возросло после появления NeXT компании в 1996 году WebObjects , который изначально был написан на Objective-C (который в значительной степени заимствован у Smalltalk) и помог реализовать принципы MVC. Позже шаблон MVC стал популярен среди разработчиков Java, когда WebObjects был портирован на Java . Более поздние платформы для Java, такие как Spring (выпущенный в октябре 2002 г.), продолжили прочную связь между Java и MVC.
В 2003 году Мартин Фаулер опубликовал «Шаблоны архитектуры корпоративных приложений» , в которых MVC был представлен как шаблон, в котором «контроллер ввода» получает запрос, отправляет соответствующие сообщения объекту модели, принимает ответ от объекта модели и передает ответ соответствующий вид для отображения. [8] : 56 Это близко к подходу, используемому в платформе веб-приложений Ruby on Rails (август 2004 г.), в которой клиент отправляет запросы на сервер через представление в браузере , эти запросы обрабатываются контроллером на сервере, а контроллер взаимодействует с соответствующими объектами модели. [12] Платформа Django (июль 2005 г., для Python ) предложила аналогичный подход к шаблону «представление шаблона модели» (MTV), в котором представление извлекает данные из моделей и передает их в шаблоны для отображения. [13] И Rails, и Django дебютировали с сильным упором на быстрое развертывание, что увеличило популярность MVC за пределами традиционной корпоративной среды, в которой он уже давно популярен.
Компоненты
[ редактировать ]Модель
[ редактировать ]Центральный компонент узора. приложения Это динамическая структура данных , независимая от пользовательского интерфейса. [14] Он напрямую управляет данными, логикой и правилами приложения. В Smalltalk-80 разработка типа модели полностью оставлена на усмотрение программиста. [15] В WebObjects, Rails и Django тип модели обычно представляет собой приложения таблицу в базе данных . [16] [17] [18] Модель необходима для обеспечения организованности и согласованности данных. Это гарантирует, что данные приложения ведут себя в соответствии с определенными правилами и логикой.
Вид
[ редактировать ]Любое представление информации, например диаграмма , диаграмма или таблица. Возможны несколько представлений одной и той же информации, например гистограмма для руководства и табличное представление для бухгалтеров .
В Smalltalk-80 представление — это просто визуальное представление модели, не обрабатывающее ввод пользователя. [19] В WebObjects представление представляет собой полный элемент пользовательского интерфейса, такой как меню или кнопка, и не получает входные данные от пользователя. [20] Однако и в Smalltalk-80, и в WebObjects представления должны быть универсальными и составными . [21] [22]
В Rails и Django роль представления играют HTML- шаблоны, поэтому в их схеме представление определяет пользовательский интерфейс в браузере, а не представляет непосредственно виджет пользовательского интерфейса. [23] [24] (В свете этого Django предпочитает называть объекты такого типа «шаблоном». [25] ) Этот подход уделяет относительно меньше внимания небольшим, составным представлениям; типичное представление Rails имеет отношение один к одному с действием контроллера. [26]
Представления Smalltalk-80 взаимодействуют как с моделью, так и с контроллером. [27] тогда как в случае с WebObjects представление взаимодействует только с контроллером, который затем взаимодействует с моделью. [28] В Rails и Django представление/шаблон используется контроллером/представлением при подготовке ответа клиенту. [29] [30]
Контроллер
[ редактировать ]Принимает входные данные и преобразует их в команды для модели или представления. [31]
Контроллер Smalltalk-80 обрабатывает события пользовательского ввода, такие как нажатие кнопок или движение мыши. [32] В любой момент времени с каждым контроллером связано одно представление и модель, хотя один объект модели может получать сигналы от множества разных контроллеров. В любой момент времени только один контроллер, «активный», получает пользовательский ввод; объект глобального оконного менеджера отвечает за настройку текущего активного контроллера. Если пользовательский ввод требует изменения в модели, контроллер подает сигнал модели об изменении, но затем модель несет ответственность за обновление своих представлений. [33]
В WebObjects представления обрабатывают ввод пользователя, а контроллер выступает посредником между представлениями и моделями. Для каждого приложения может быть только один контроллер или один контроллер для каждого окна. Большая часть логики, специфичной для приложения, находится в контроллере. [34]
В Rails запросы, поступающие в серверное приложение от клиента, отправляются на « маршрутизатор », который сопоставляет запрос с конкретным методом конкретного контроллера. В рамках этого метода контроллер взаимодействует с данными запроса и любыми соответствующими объектами модели и готовит ответ, используя представление. Традиционно каждое представление имеет связанный с ним контроллер; например, если приложение имело client
представление, обычно оно имеет связанный Clients
контроллер тоже. Однако разработчики могут создавать и другие типы контроллеров, если захотят. [35]
Django называет объект, играющий эту роль, «представлением», а не контроллером. [30] Представление Django — это функция, которая получает веб-запрос и возвращает веб-ответ. Для создания ответа он может использовать шаблоны. [36]
Взаимодействия
[ редактировать ]Помимо разделения приложения на модель, представление и компонент-контроллер, шаблон проектирования MVC определяет взаимодействие между этими тремя компонентами: [37]
- Модель отвечает за управление данными приложения. Он получает пользовательский ввод от контроллера.
- Представление отображает представление модели в определенном формате.
- Контроллер реагирует на ввод пользователя и выполняет взаимодействие с объектами модели данных. Контроллер получает входные данные, при необходимости проверяет их, а затем передает входные данные в модель.
Как и другие шаблоны программного обеспечения, MVC выражает «ядро решения» проблемы, позволяя при этом адаптировать его для каждой системы. [38] Конкретные конструкции MVC могут существенно отличаться от традиционного описания, приведенного здесь. [39]
Мотивация
[ редактировать ]Как писал Алан Кей в 2003 году, первоначальной целью MVC было создание графического интерфейса для любого объекта. [40] Это подробно описано в книге Ричарда Поусона «Обнаженные объекты» . [40]
Трюгве Реенскауг, создатель MVC в PARC, написал, что «MVC был задуман как общее решение проблемы пользователей, управляющих большим и сложным набором данных». [6]
В своем руководстве Inside Smalltalk 1991 года информатики профессора Карлтонского университета Уилф Лалонд и Джон Пью описали преимущества MVC в стиле Smalltalk-80 следующим образом:
- независимость представления и данных, например, несколько представлений одной модели одновременно,
- составные виджеты презентации, например, одно представление используется как подпредставление другого,
- переключаемые режимы ввода путем замены одного контроллера на другой во время выполнения [ необходимо уточнение ] , и
- независимость обработки ввода и вывода благодаря разделению обязанностей контроллеров и представлений. [41]
Использование в веб-приложениях
[ редактировать ]Хотя изначально MVC был разработан для настольных компьютеров , он получил широкое распространение в качестве дизайна для Всемирной паутины приложений на основных языках программирования . несколько веб-фреймворков Было создано , которые реализуют этот шаблон. Эти программные платформы различаются по своим интерпретациям, в основном по способу разделения обязанностей MVC между клиентом и сервером . [42] Ранние платформы MVC использовали подход тонкого клиента , при котором почти вся логика модели, представления и контроллера размещалась на сервере. При таком подходе клиент отправляет запросы гиперссылок или отправку форм контроллеру, а затем получает полную и обновленную веб-страницу (или другой документ) из представления; модель полностью существует на сервере. [42] Более поздние платформы позволили компонентам MVC частично выполняться на клиенте, используя Ajax для синхронизации данных.
См. также
[ редактировать ]- Действие-домен-ответчик
- Бистро Фреймворк
- Шаблон «Entity-Control-Boundary»
- Иерархическая модель-представление-контроллер
- Модель-представление-адаптер
- Модель-представление-презентатор
- Модель-представление-представление-модель
- Многоуровневая архитектура
- Шаблон наблюдателя
- Презентация-абстракция-управление
- Разделение интересов
- Паттерн стратегии
Ссылки
[ редактировать ]- ^ «Принципы чистой архитектуры дяди Боба Мартина» . Ютуб . 15 декабря 2015 г.
- ^ Реенскауг, Трюгве; Коплиен, Джеймс О. (20 марта 2009 г.). «Архитектура DCI: новый взгляд на объектно-ориентированное программирование» . Разработчик Артима . Архивировано из оригинала 23 марта 2009 года . Проверено 3 августа 2019 г.
На более глубоком уровне существует структура, позволяющая отделить представление информации от взаимодействия с пользователем.
- ^ Бербек (1992): «... пользовательский ввод, моделирование внешнего мира и визуальная обратная связь с пользователем явно разделены и обрабатываются тремя типами объектов».
- ^ Дэвис, Ян. «Каковы преимущества MVC?» . Интернет-алхимия . Проверено 29 ноября 2016 г.
- ^ Модель–Представление–История контроллера . C2.com (11 мая 2012 г.). Проверено 9 декабря 2013 г.
- ^ Jump up to: а б с д и Заметки и исторические документы Трюгве Реенскауга, изобретателя MVC.
- ^ «Примечание о требованиях DynaBook», Trygve Reenskaug, 22 марта 1979 г., SysReq.pdf .
- ^ Jump up to: а б Фаулер, Мартин (2003). Шаблоны архитектуры корпоративных приложений . Pearson Education, Inc. ISBN 0-321-12742-0 .
- ^ Гольдберг, Адель (1984). Smalltalk-80: Интерактивная среда программирования . Аддисон-Уэсли. ISBN 0-201-11372-4 .
- ^ Краснер, Гленн Э.; Поуп, Стивен Т. (август – сентябрь 1988 г.). «Книга рецептов для использования парадигмы пользовательского интерфейса контроллера модель-представление в Smalltalk-80» . Журнал объектных технологий . 1 (3). Публикации SIGS: 26–49. Также опубликовано как « Описание парадигмы пользовательского интерфейса модель-представление-контроллер в системе Smalltalk-80 » (отчет), ParcPlace Systems; Проверено 5 июня 2012 г.
- ^ Эволюция MVC и других архитектур пользовательского интерфейса от Мартина Фаулера.
- ^ «Руководства по Ruby on Rails» . Проверено 19 марта 2022 г.
- ^ «Часто задаваемые вопросы по Django: Django выглядит как платформа MVC, но вы называете контроллер «представлением», а представление — «шаблоном». Почему вы не используете стандартные имена?» . Проверено 19 марта 2022 г.
- ^ Бербек, Стив (1992) Программирование приложений в Smalltalk-80: Как использовать модель-представление-контроллер (MVC)
- ^ ЛаЛонд, Уилф Р.; Пью, Джон Р. (1991). Внутри Smalltalk . США: Prentice-Hall Inc., с. 8. ISBN 0-13-467309-3 .
Моделью может быть любой объект без ограничений.
- ^ Обзор системы WebObjects (PDF) . Купертино, Калифорния: Apple Computer, Inc., май 2001 г. с. 28.
В WebObjects модель устанавливает и поддерживает соответствие между классом корпоративных объектов и данными, хранящимися в реляционной базе данных.
- ^ «Основы активной записи» . Рельсовые направляющие . Проверено 27 октября 2022 г.
Это создаст
Product
модель, сопоставленная с таблицей продуктов в базе данных. - ^ «Модели» . Документация Джанго . Проверено 27 октября 2022 г.
Обычно каждая модель сопоставляется с одной таблицей базы данных.
- ^ ЛаЛонд, Уилф Р.; Пью, Джон Р. (1991). Внутри Smalltalk . США: Prentice-Hall Inc., с. 8. ISBN 0-13-467309-3 .
Представление отвечает за визуальное представление объекта.
- ^ Обзор системы WebObjects (PDF) . Купертино, Калифорния: Apple Computer, Inc., май 2001 г. с. 28.
Объекты просмотра представляют собой объекты, видимые в пользовательском интерфейсе (например, окна или кнопки).
- ^ ЛаЛонд, Уилф Р.; Пью, Джон Р. (1991). Внутри Smalltalk . США: Prentice-Hall Inc., с. 8. ISBN 0-13-467309-3 .
[MVC] позволяет использовать представления как детали для сборки в более крупные блоки; новые виды представлений могут быть созданы с использованием существующих представлений в качестве подпредставлений.
- ^ Обзор системы WebObjects (PDF) . Купертино, Калифорния: Apple Computer, Inc., май 2001 г. с. 28.
Объекты представления, как правило, допускают многократное использование и поэтому обеспечивают согласованность между приложениями.
- ^ «Обзор представления действий» . Рельсовые направляющие . Проверено 27 октября 2022 г.
Шаблоны представления действий написаны с использованием встроенного Ruby в теги, смешанные с HTML.
- ^ «Шаблоны» . Документация Джанго . Проверено 27 октября 2022 г.
Шаблон содержит статические части желаемого вывода HTML, а также специальный синтаксис, описывающий, как будет вставлен динамический контент.
- ^ «Часто задаваемые вопросы по Django: Django выглядит как платформа MVC, но вы называете контроллер «представлением», а представление — «шаблоном». Почему вы не используете стандартные имена?» . Проверено 27 октября 2022 г.
- ^ «Обзор представления действий» . Рельсовые направляющие . Проверено 27 октября 2022 г.
Обычно представления разделяют свое имя с соответствующим действием контроллера...
- ^ ЛаЛонд, Уилф Р.; Пью, Джон Р. (1991). Внутри Smalltalk . США: Prentice-Hall Inc., с. 9. ISBN 0-13-467309-3 .
... представление явно знает о модели и контроллере.
- ^ Обзор системы WebObjects (PDF) . Купертино, Калифорния: Apple Computer, Inc., май 2001 г. с. 28.
В качестве посредника между объектами модели и объектами представления в приложении выступает объект контроллера.
- ^ «Обзор представления действий» . Рельсовые направляющие . Проверено 27 октября 2022 г.
В Rails веб-запросы обрабатываются контроллером действий и представлением действий. Обычно контроллер действий занимается связью с базой данных и выполнением действий CRUD, где это необходимо. Затем представление действий отвечает за компиляцию ответа.
- ^ Jump up to: а б «Часто задаваемые вопросы по Django: Django выглядит как платформа MVC, но вы называете контроллер «представлением», а представление — «шаблоном». Почему вы не используете стандартные имена?» . Проверено 27 октября 2022 г.
В Django «представление» описывает, какие данные представлены, но представление обычно делегирует шаблон, который описывает, как представляются данные.
- ^ Простой пример архитектурного шаблона MVC (модель-представление-контроллер) для абстракции.
- ^ ЛаЛонд, Уилф Р.; Пью, Джон Р. (1991). Внутри Smalltalk . США: Prentice-Hall Inc., с. 8. ISBN 0-13-467309-3 .
Контроллер отвечает за взаимодействие между пользователем и моделью/представлением. Он интерпретирует символы клавиатуры вместе с движениями мыши и щелчками.
- ^ ЛаЛонд, Уилф Р.; Пью, Джон Р. (1991). Внутри Smalltalk . США: Prentice-Hall Inc., с. 11. ISBN 0-13-467309-3 .
- ^ Обзор системы WebObjects (PDF) . Купертино, Калифорния: Apple Computer, Inc., май 2001 г. с. 28.
- ^ «Обзор представления действий» . Рельсовые направляющие . Проверено 27 октября 2022 г.
Обычно представления разделяют свое имя с соответствующим действием контроллера...
- ^ «Написание просмотров» . Документация Джанго . Проверено 27 октября 2022 г.
- ^ Бушманн, Франк (1996) Шаблонно-ориентированная архитектура программного обеспечения .
- ^ Гамма, Эрих и др. (1994) Шаблоны проектирования
- ^ Мур, Дана и др. (2007) Профессиональные многофункциональные интернет-приложения: Ajax и за его пределами : «С момента появления MVC существовало множество интерпретаций этого шаблона. Эта концепция была адаптирована и применена самыми разными способами к широкому спектру систем и архитектур».
- ^ Jump up to: а б Алан Кей (23 мая 2003 г.). "действительно ли Squeak объектно-ориентирован?" . Список рассылки Squeak Foundation . Проверено 26 октября 2021 г.
- ^ ЛаЛонд, Уилф Р.; Пью, Джон Р. (1991). Внутри Smalltalk . Том. 2. США: Prentice-Hall Inc., стр. 8–9. ISBN 0-13-467309-3 .
- ^ Jump up to: а б Лефф, Авраам; Рэйфилд, Джеймс Т. (сентябрь 2001 г.). Разработка веб-приложений с использованием шаблона проектирования «модель/представление/контроллер» . Конференция IEEE Enterprise по распределенным объектным вычислениям. стр. 118–127.