<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=Model-View-Controller</id>
	<title>Model-View-Controller - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=Model-View-Controller"/>
	<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=Model-View-Controller&amp;action=history"/>
	<updated>2026-05-05T17:58:38Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.dzmuh.com/index.php?title=Model-View-Controller&amp;diff=13239&amp;oldid=prev</id>
		<title>Dzmuh: Новая страница: «{{redirect|MVC}} {{Шаблон проектирования  | диаграмма             = 240px  | тип                   =  | назначение            =  | структура             = * Модель * Контроллер * Представление  | применяется_в_случаях =  | плюсы                 =  | минусы                =  | родственные_шаблоны   = }} '...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=Model-View-Controller&amp;diff=13239&amp;oldid=prev"/>
		<updated>2023-09-11T17:32:21Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «{{redirect|MVC}} {{Шаблон проектирования  | диаграмма             = &lt;a href=&quot;/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:MVC-Process.png&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Файл:MVC-Process.png (страница не существует)&quot;&gt;240px&lt;/a&gt;  | тип                   =  | назначение            =  | структура             = * Модель * Контроллер * Представление  | применяется_в_случаях =  | плюсы                 =  | минусы                =  | родственные_шаблоны   = }} &amp;#039;...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{redirect|MVC}}&lt;br /&gt;
{{Шаблон проектирования&lt;br /&gt;
 | диаграмма             = [[Файл:MVC-Process.png|240px]]&lt;br /&gt;
 | тип                   =&lt;br /&gt;
 | назначение            =&lt;br /&gt;
 | структура             =&lt;br /&gt;
* Модель&lt;br /&gt;
* Контроллер&lt;br /&gt;
* Представление&lt;br /&gt;
 | применяется_в_случаях =&lt;br /&gt;
 | плюсы                 =&lt;br /&gt;
 | минусы                =&lt;br /&gt;
 | родственные_шаблоны   =&lt;br /&gt;
}}&lt;br /&gt;
'''Model-View-Controller''' ('''MVC''', «Модель-Представление-Контроллер», «Модель-Вид-Контроллер») — схема разделения данных приложения  и управляющей логики на три отдельных компонента: модель, представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо{{sfn|Обобщённый Model-View-Controller|2007}}.&lt;br /&gt;
&lt;br /&gt;
* '''''Модель''''' (''Model'') предоставляет данные и реагирует на команды контроллера, изменяя своё состояние{{sfn|Обобщённый Model-View-Controller|2007}}.&lt;br /&gt;
* '''''Представление''''' (''View'') отвечает за отображение данных модели пользователю, реагируя на изменения модели{{sfn|Обобщённый Model-View-Controller|2007}}.&lt;br /&gt;
* '''''Контроллер''''' (''Controller'') интерпретирует действия пользователя, оповещая модель о необходимости изменений{{sfn|Обобщённый Model-View-Controller|2007}}.&lt;br /&gt;
&lt;br /&gt;
== История ==&lt;br /&gt;
Концепция MVC была описана [[Реенскауг, Трюгве|Трюгве Реенскаугом]] в 1978 году{{sfn|Обобщённый Model-View-Controller|2007}}&amp;lt;ref&amp;gt;Trygve M. H. [http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html Reenskaug/MVC] {{Архивировано|url=https://wayback.archive-it.org/10370/20180425072145/http://folk.uio.no/trygver/themes/mvc/mvc-index.html |date=2018-04-25 }} XEROX PARC 1978-79&amp;lt;/ref&amp;gt;, работавшим в научно-исследовательском центре «[[Xerox PARC]]» над языком программирования «[[Smalltalk]]». Позже, Стив Бурбек реализовал шаблон в [[Smalltalk-80]]{{sfn|Обобщённый Model-View-Controller|2007}}&amp;lt;ref name=&amp;quot;автоссылка2&amp;quot;&amp;gt;{{статья|автор=Стив Бурбек|заглавие=A Description of the Model-View-Controller User&lt;br /&gt;
Interface Paradigm in the Smalltalk-80 System|ссылка=http://www.itu.dk/courses/VOP/E2005/VOP2005E/8_mvc_krasner_and_pope.pdf|archiveurl=https://web.archive.org/web/20100921030808/http://www.itu.dk/courses/VOP/E2005/VOP2005E/8_mvc_krasner_and_pope.pdf|archivedate=2010-09-21|url=http://www.itu.dk/courses/VOP/E2005/VOP2005E/8_mvc_krasner_and_pope.pdf|deadlink=да}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;автоссылка1&amp;quot;&amp;gt;{{статья|автор=В. А. Савельев|заглавие=Программирование Приложений в Smalltalk-80™: Как использовать Model-View-Controller (MVC)|ссылка=http://www.math.rsu.ru/smalltalk/gui/mvc-rus.pdf|archivedate=2017-08-07|archiveurl=https://web.archive.org/web/20170807210025/http://www.math.rsu.ru/smalltalk/gui/mvc-rus.pdf}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Окончательная версия концепции MVC была опубликована лишь в 1988 году в журнале {{iw|Technology Object|||The Journal of Object Technology}}&amp;lt;ref&amp;gt;[http://dl.acm.org/citation.cfm?id=50757.50759 A cookbook for using the model-view controller user interface paradigm in Smalltalk-80] {{Wayback|url=http://dl.acm.org/citation.cfm?id=50757.50759 |date=20170715084311 }}, [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] ([http://www.math.rsu.ru/smalltalk/gui/mvc-rus.pdf перевод В. А. Савельев] {{Wayback|url=http://www.math.rsu.ru/smalltalk/gui/mvc-rus.pdf |date=20170807210025 }})&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Впоследствии шаблон проектирования стал эволюционировать. Например, была представлена иерархическая версия [[HMVC]]; {{iw|MVA|||Model–view–adapter}}, [[MVVM]]&amp;lt;ref&amp;gt;{{cite web|title=A cookbook for using the model-view controller user interface paradigm in Smalltalk-80|url=http://dl.acm.org/citation.cfm?id=50757.50759|access-date=2017-01-10|archive-date=2017-07-15|archive-url=https://web.archive.org/web/20170715084311/http://dl.acm.org/citation.cfm?id=50757.50759|deadlink=no}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;автоссылка2&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;автоссылка1&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Дальнейший виток популярности привнесло развитие фреймворков, ориентированных на быструю развёртку, на языках [[Python|Python (]][[Django]]), [[PHP|PHP (]][[Laravel]]) и [[Ruby]] ([[Ruby on Rails|Ruby on Rails)]]. На момент 2017 года, фреймворки с MVC заняли заметные позиции по отношению к остальным фреймворкам без этого шаблона&amp;lt;ref&amp;gt;{{Cite web |url=http://hotframeworks.com/ |title=hotframeworks |access-date=2017-01-10 |archive-date=2017-02-10 |archive-url=https://web.archive.org/web/20170210114756/http://hotframeworks.com/ |deadlink=no }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Различия описания концепции шаблона ==&lt;br /&gt;
С развитием объектно-ориентированного программирования и понятия о [[Шаблоны проектирования|шаблонах проектирования]] — был создан ряд модификаций концепции MVC, которые при реализации у разных авторов могут отличаться от оригинальной. Так, например, Эриан Верми в 2004 году описал пример обобщённого MVC&amp;lt;ref&amp;gt;Vermeij. [http://onjava.com/pub/a/onjava/2004/07/07/genericmvc.html Arjan A Generic MVC Model in Java] {{Wayback|url=http://onjava.com/pub/a/onjava/2004/07/07/genericmvc.html |date=20111001025613 }} 2004&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В предисловии к диссертации «[[Naked objects]]» Ричарда Поусона (Richard Pawson) Трюгве Реенскауг упоминает свою неопубликованную наиболее раннюю версию MVC, согласно которой&amp;lt;ref&amp;gt;Richard Pawson [https://isis.apache.org/resources/thesis/Pawson-Naked-Objects-thesis.pdf Naked objects] {{webarchive|url=https://web.archive.org/web/20151028040144/http://isis.apache.org/resources/thesis/Pawson-Naked-Objects-thesis.pdf |date=2015-10-28 }}, PhD dissertation, University of Dublin, Trinity College, 2004&amp;lt;/ref&amp;gt;:&lt;br /&gt;
* Модель относилась к «разуму» пользователя;&lt;br /&gt;
* Под представлением имелся в виду редактор, позволяющий пользователю просматривать и обновлять информацию;&lt;br /&gt;
* Контроллер являлся инструментом для связывания представлений воедино и применялся пользователем для решения его задач.&lt;br /&gt;
&lt;br /&gt;
== Назначение ==&lt;br /&gt;
Основная цель применения этой концепции состоит в отделении [[Бизнес-логика|бизнес-логики]] (''модели'') от её визуализации (''представления'', ''вида''). За счёт такого разделения повышается возможность [[Повторное использование кода|повторного использования кода]]. Наиболее полезно применение данной концепции в тех случаях, когда пользователь должен видеть те же самые данные одновременно в различных контекстах и/или с различных точек зрения. В частности, выполняются следующие задачи:&lt;br /&gt;
# К одной ''модели'' можно присоединить несколько ''видов'', при этом не затрагивая реализацию ''модели''. Например, некоторые данные могут быть одновременно представлены в виде [[Электронная таблица|электронной таблицы]], [[Гистограмма|гистограммы]] и [[Круговая диаграмма|круговой диаграммы]];&lt;br /&gt;
# Не затрагивая реализацию ''видов'', можно изменить реакции на действия пользователя (нажатие мышью на кнопке, ввод данных) — для этого достаточно использовать другой ''контроллер'';&lt;br /&gt;
# Ряд разработчиков специализируется только в одной из областей: либо разрабатывают графический [[Интерфейс пользователя|интерфейс]], либо разрабатывают [[Бизнес-логика|бизнес-логику]]. Поэтому возможно добиться того, что программисты, занимающиеся разработкой [[Бизнес-логика|бизнес-логики]] (''модели''), вообще не будут осведомлены о том, какое ''представление'' будет использоваться.&lt;br /&gt;
&lt;br /&gt;
== Концепция ==&lt;br /&gt;
{{Нет источников в разделе|дата=2017-01-13}}&lt;br /&gt;
&lt;br /&gt;
Концепция MVC позволяет разделить модель, представление и контроллер на три отдельных компонента:&lt;br /&gt;
&lt;br /&gt;
=== Модель ===&lt;br /&gt;
Модель предоставляет данные и методы работы с ними: запросы в базу данных, проверка на корректность. Модель не зависит от представления (не знает как данные визуализировать) и контроллера (не имеет точек взаимодействия с пользователем), просто предоставляя доступ к данным и управлению ими.&lt;br /&gt;
&lt;br /&gt;
Модель строится таким образом, чтобы отвечать на запросы, изменяя своё состояние, при этом может быть встроено уведомление «[[Наблюдатель (шаблон проектирования)|наблюдателей]]».&lt;br /&gt;
&lt;br /&gt;
Модель, за счёт независимости от визуального представления, может иметь несколько различных представлений для одной «модели»&lt;br /&gt;
&lt;br /&gt;
=== Представление ===&lt;br /&gt;
Представление отвечает за получение необходимых данных из модели и отправляет их пользователю. &lt;br /&gt;
Представление не обрабатывает введённые данные пользователя &amp;lt;ref&amp;gt;{{Cite web |url=http://ima.udg.edu/~sellares/EINF-ES1/MVC-Toni.pdf |title=Toni Sellarès, &amp;quot;The Model View Controller: a Composed Pattern.&amp;quot; |access-date=2017-08-16 |archive-date=2017-12-15 |archive-url=https://web.archive.org/web/20171215085136/http://ima.udg.edu/~sellares/EINF-ES1/MVC-Toni.pdf |deadlink=no }}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Контроллер ===&lt;br /&gt;
Контроллер обеспечивает «связь» между пользователем и системой. Контролирует и направляет данные от пользователя к системе и наоборот. Использует модель и представление для реализации необходимого действия.&lt;br /&gt;
&lt;br /&gt;
=== Функциональные возможности и расхождения ===&lt;br /&gt;
Поскольку MVC не имеет строгой реализации, то реализован он может быть по-разному. Нет общепринятого определения, где должна располагаться бизнес-логика. Она может находиться как в контроллере, так и в модели. В последнем случае, модель будет содержать все бизнес-объекты со всеми данными и функциями.&lt;br /&gt;
&lt;br /&gt;
Некоторые фреймворки жёстко задают, где должна располагаться бизнес-логика, другие не имеют таких правил.&lt;br /&gt;
&lt;br /&gt;
Также не указано, где должна находиться проверка введённых пользователем данных. Простая валидация может встречаться даже в представлении, но чаще они встречаются в контроллере или модели.&lt;br /&gt;
&lt;br /&gt;
Интернационализация и форматирование данных также не имеет четких указаний по расположению.&lt;br /&gt;
&lt;br /&gt;
== Условно-обязательные модификации ==&lt;br /&gt;
Для реализации схемы «Model-View-Controller» используется достаточно большое число [[шаблон проектирования|шаблонов проектирования]] (в зависимости от сложности архитектурного решения), основные из которых — «[[Наблюдатель (шаблон проектирования)|наблюдатель]]», «[[Стратегия (шаблон проектирования)|стратегия]]», «[[Компоновщик (шаблон проектирования)|компоновщик]]»&amp;lt;ref&amp;gt;Э. Гамма, Р. Хелм, Р. Джонсон, [[Влисидис, Джон|Дж. Влиссидес]]. [http://www.kodges.ru/58405-priemy-obektno-orientirovannogo-proektirovaniya..html Приёмы объектно-ориентированного проектирования. Паттерны проектирования] {{Wayback|url=http://www.kodges.ru/58405-priemy-obektno-orientirovannogo-proektirovaniya..html |date=20111026115700 }} 2001&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наиболее типичная реализация — в которой представление отделено от модели путём установления между ними протокола взаимодействия, использующего «аппарат событий» (обозначение ''«событиями»'' определённых ситуаций, возникающих в ходе выполнения программы, — и рассылка уведомлений о них всем тем, кто подписался на получение): при каждом особом изменении внутренних данных в модели (обозначенном как «событие»), она оповещает о нём те зависящие от неё представления, которые подписаны на получение такого оповещения — и представление обновляется. Так используется шаблон «[[Наблюдатель (шаблон проектирования)|наблюдатель]]».&lt;br /&gt;
&lt;br /&gt;
При обработке реакции пользователя — представление выбирает, в зависимости от реакции, нужный ''контроллер'', который обеспечит ту или иную связь с моделью. Для этого используется шаблон «[[Стратегия (шаблон проектирования)|стратегия]]», или вместо этого может быть модификация с использованием шаблона «[[Команда (шаблон проектирования)|команда]]».&lt;br /&gt;
&lt;br /&gt;
Для возможности однотипного обращения с подобъектами сложно-составного [[Иерархия|иерархического]] вида — может использоваться шаблон «[[Компоновщик (шаблон проектирования)|компоновщик]]». Кроме того, могут использоваться и другие [[Шаблон проектирования|шаблоны проектирования]] — например, «[[Фабричный метод (шаблон проектирования)|фабричный метод]]», который позволит задать по умолчанию тип контроллера для соответствующего вида.&lt;br /&gt;
&lt;br /&gt;
== Наиболее частые ошибки ==&lt;br /&gt;
Начинающие программисты очень часто трактуют архитектурную модель MVC как пассивную модель MVC: модель выступает исключительно совокупностью функций для доступа к данным, а контроллер содержит [[Бизнес-логика|бизнес-логику]]. В результате — код моделей по факту является средством получения данных из [[СУБД]], а контроллер — типичным [[Модульное программирование|модулем]], наполненным бизнес-логикой. В результате такого понимания — MVC-разработчики стали писать код, который Падриг Брэди (известный в кругах сообщества «[[Zend Framework]]») охарактеризовал как «ТТУК» («Толстые, тупые, уродливые контроллеры»; Fat Stupid Ugly Controllers):&lt;br /&gt;
&lt;br /&gt;
{{начало цитаты}}&lt;br /&gt;
Среднестатистический ТТУК получал данные из БД (используя уровень абстракции базы данных, делая вид, что это модель) или манипулировал, проверял, записывал, а также передавал данные в Представление. Такой подход стал очень популярен потому, что использование таких контроллеров похоже на классическую практику использования отдельного php-файла для каждой страницы приложения.&lt;br /&gt;
{{конец цитаты|источник=[http://blog.astrumfutura.com/2008/12/the-m-in-mvc-why-models-are-misunderstood-and-unappreciated/ The M in MVC: Why Models are Misunderstood and Unappreciated | Pádraic Brady] [http://zendframework.ru/anonses/model-with-mvc перевод]}}&lt;br /&gt;
&lt;br /&gt;
Но в [[Объектно-ориентированное программирование|объектно-ориентированном]] программировании используется активная модель&amp;lt;ref&amp;gt;{{Cite web |url=https://www.rsdn.org/article/patterns/generic-mvc.xml#EEGAC |title=Обобщенный Model-View-Controller&amp;lt;!-- Заголовок добавлен ботом --&amp;gt; |access-date=2020-06-17 |archive-date=2020-02-17 |archive-url=https://web.archive.org/web/20200217033354/http://rsdn.org/article/patterns/generic-mvc.xml#EEGAC |deadlink=no }}&amp;lt;/ref&amp;gt; MVC, где модель — это не только совокупность кода доступа к данным и [[Система управления базами данных|СУБД]], но и вся [[бизнес-логика]]; также модели могут [[Инкапсуляция (программирование)|инкапсулировать]] в себе другие модели. Контроллеры же, — как элементы [[Информационная система|информационной системы]], — ответственны лишь за:&lt;br /&gt;
* приём запроса от [[Пользователь|пользователя]];&lt;br /&gt;
* анализ запроса;&lt;br /&gt;
* выбор следующего действия системы, соответственно результатам анализа (например, передача запроса другим элементам системы).&lt;br /&gt;
Только в этом случае контроллер становится «тонким» и выполняет исключительно функцию связующего звена (glue layer) между отдельными компонентами [[Информационная система|информационной системы]].&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Model-View-ViewModel]]&lt;br /&gt;
* [[Model-View-Presenter]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга|заглавие=ASP.NET MVC 4 с примерами на C# 5.0  для профессионалов, 4-е издание|оригинал=Pro ASP.NET MVC 4, 4th edition|автор=Адам Фримен|страниц=688|isbn=978-5-8459-1867-3|год=2013|место=М.|издательство=[[Вильямс (издательство)|«Вильямс»]]}}&lt;br /&gt;
* {{книга|заглавие=ASP.NET MVC 4: разработка реальных веб-приложений с помощью ASP.NET MVC|оригинал=Programming ASP.NET MVC 4: Developing Real-World Web Applications with ASP.NET MVC|автор=Джесс Чедвик и др.|страниц=432|isbn=978-5-8459-1841-3|год=2013|место=М.|издательство=[[Вильямс (издательство)|«Вильямс»]]}}&lt;br /&gt;
* {{публикация|статья|автор=Сергей Рогачев|заглавие=Обобщённый Model-View-Controller|год=2007|издание=rsdn.org|ссылка=http://rsdn.org/article/patterns/generic-mvc.xml|ref=Обобщённый Model-View-Controller}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{википедия|Model-View-Controller}}&lt;br /&gt;
* MVC простым языком — на [http://www.phpinfo.su/articles/theory/model_view_controller.html примере автомобиля] {{Wayback|url=http://www.phpinfo.su/articles/theory/model_view_controller.html |date=20150704040856 }}&lt;br /&gt;
* Сергей Бердачук. [http://berdaflex.com/ru/eclipse/books/rcp_filemanager/ch04s06.html Eclipse RCP. Файловый менеджер]&lt;br /&gt;
* [http://www.rsdn.ru/article/patterns/modelviewpresenter.xml Model-View-Controller в .Net]&lt;br /&gt;
* [http://www.ibm.com/developerworks/ru/library/wi-embed/index.html?ca=dre-ru Разработка встроенных приложений с использованием eSWT]&lt;br /&gt;
&lt;br /&gt;
{{Типы шаблонов проектирования}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Архитектурные шаблоны проектирования]]&lt;/div&gt;</summary>
		<author><name>Dzmuh</name></author>
	</entry>
</feed>