HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Последовательность запрос-обработка-ответ - основа, на которую нанизывается все остальное. Фреймворки идут дальше и разделяют приложение на дополнительные слои уже внутри самого процесса обработки запроса. Без такого разделения код быстро превращается в мешанину из запросов к базе данных, формирований HTML и логики обработки данных. Но с помощью MVC можно выполнять операции отдельно друг от друга.</p>
1 <p>Последовательность запрос-обработка-ответ - основа, на которую нанизывается все остальное. Фреймворки идут дальше и разделяют приложение на дополнительные слои уже внутри самого процесса обработки запроса. Без такого разделения код быстро превращается в мешанину из запросов к базе данных, формирований HTML и логики обработки данных. Но с помощью MVC можно выполнять операции отдельно друг от друга.</p>
2 <p>В этом уроке разберем один из ключевых архитектурных паттернов построения пользовательских приложений - MVC. Мы узнаем, на какие три компонента он разделяется и для чего применяется.</p>
2 <p>В этом уроке разберем один из ключевых архитектурных паттернов построения пользовательских приложений - MVC. Мы узнаем, на какие три компонента он разделяется и для чего применяется.</p>
3 <h2>Что такое MVC</h2>
3 <h2>Что такое MVC</h2>
4 <p>Из обработки запроса естественным образом по порядку выделяются следующие слои шаблонов:</p>
4 <p>Из обработки запроса естественным образом по порядку выделяются следующие слои шаблонов:</p>
5 <ul><li><strong>Model</strong>- модель</li>
5 <ul><li><strong>Model</strong>- модель</li>
6 <li><strong>View</strong>- представление</li>
6 <li><strong>View</strong>- представление</li>
7 <li><strong>Controller</strong>- контроллер</li>
7 <li><strong>Controller</strong>- контроллер</li>
8 </ul><p>Остальное добавляется по мере роста сложности приложения. В итоге из этих трех слоев мы и получаем аббревиатуру<strong>MVC (Model-View-Controller)</strong>- архитектурный паттерн построения пользовательских приложений.</p>
8 </ul><p>Остальное добавляется по мере роста сложности приложения. В итоге из этих трех слоев мы и получаем аббревиатуру<strong>MVC (Model-View-Controller)</strong>- архитектурный паттерн построения пользовательских приложений.</p>
9 <p>Существует две версии MVC. Первую придумали изначально в сообществе программистов на SmallTalk. Она создавалась под толстые клиенты, а они представляют собой событийные системы, как современные фронтенд-приложения.</p>
9 <p>Существует две версии MVC. Первую придумали изначально в сообществе программистов на SmallTalk. Она создавалась под толстые клиенты, а они представляют собой событийные системы, как современные фронтенд-приложения.</p>
10 <p>На сервере используется другая вариация MVC, которая называется<strong>MVC v2</strong>. Буквы в ней те же, но означают местами другое. И самое главное, что совсем по-другому строится взаимодействие:</p>
10 <p>На сервере используется другая вариация MVC, которая называется<strong>MVC v2</strong>. Буквы в ней те же, но означают местами другое. И самое главное, что совсем по-другому строится взаимодействие:</p>
11 <p>Архитектурный шаблон MVC задает основную структуру приложения и позволяет коду достаточно долго развиваться. При этом он остается удобным в поддержке. MVC с некоторыми модификациями реализуется всеми веб-фреймворками.</p>
11 <p>Архитектурный шаблон MVC задает основную структуру приложения и позволяет коду достаточно долго развиваться. При этом он остается удобным в поддержке. MVC с некоторыми модификациями реализуется всеми веб-фреймворками.</p>
12 <h3>Model</h3>
12 <h3>Model</h3>
13 <p>Во всех остальных ситуациях выделяют еще один слой, который называют<strong>моделью</strong>. Она не включает в себя<strong>персистентность</strong>- постоянное хранение базы данных. Среди разработчиков распространено заблуждение, что модель - это база данных и данные внутри нее. Но это не так.</p>
13 <p>Во всех остальных ситуациях выделяют еще один слой, который называют<strong>моделью</strong>. Она не включает в себя<strong>персистентность</strong>- постоянное хранение базы данных. Среди разработчиков распространено заблуждение, что модель - это база данных и данные внутри нее. Но это не так.</p>
14 - <p>Слой модели отвечает за бизнес-логику приложения и данные, которые с ней связаны. Технически этот слой может быть представлен большим количеством разных способов, которые зависят от конкретного языка программирования и используемых библиотек. Самый распространенный вариант - это ORM. Но так бывает не всегда. Часто даже при наличии отдельного слоя модели часть логики все же проникает в контроллеры.</p>
14 + <p>Слой модели отвечает за бизнес-логику приложения и данные, которые с ней связаны. Технически этот слой может быть представлен большим количеством разных способов, которые зависят от конкретного языка программирования и используемых библиотек. Самый распространенный вариант - это ORM. Но так бывает не вседа. Часто даже при наличии отдельного слоя модели часть логики все же проникает в контроллеры.</p>
15 <p>Чтобы понять, зачем понадобилось выделять слой модели, прочитайте статью<a>Rails is not your application</a>.</p>
15 <p>Чтобы понять, зачем понадобилось выделять слой модели, прочитайте статью<a>Rails is not your application</a>.</p>
16 <p>Если кратко, идея заключалась в том, что предметная область, которую мы реализуем внутри нашего сайта, не связана ни с сайтом, ни с фреймворком, используемым внутри. Например, правила бухгалтерии не могут поменяться в зависимости от выбранного фреймворка. Бухгалтерия и фреймворк не связаны. Бизнес-правила этой области не зависят от существования программирования.</p>
16 <p>Если кратко, идея заключалась в том, что предметная область, которую мы реализуем внутри нашего сайта, не связана ни с сайтом, ни с фреймворком, используемым внутри. Например, правила бухгалтерии не могут поменяться в зависимости от выбранного фреймворка. Бухгалтерия и фреймворк не связаны. Бизнес-правила этой области не зависят от существования программирования.</p>
17 <p>С помощью программирования мы можем их выразить в коде, но этот код снова не будет связан с используемым фреймворком. В идеале код, который описывает предметную область и позволяет с ней работать, можно взять и перенести в другой фреймворк без модификаций.</p>
17 <p>С помощью программирования мы можем их выразить в коде, но этот код снова не будет связан с используемым фреймворком. В идеале код, который описывает предметную область и позволяет с ней работать, можно взять и перенести в другой фреймворк без модификаций.</p>
18 <p>Как видно, на логическом уровне есть граница между кодом, который моделирует предметную область и обслуживает веб-запросы. Но эту границу иногда трудно провести.</p>
18 <p>Как видно, на логическом уровне есть граница между кодом, который моделирует предметную область и обслуживает веб-запросы. Но эту границу иногда трудно провести.</p>
19 <p>Например, сложно сразу определить, к чему относится отправка письма при регистрации, авторизации или восстановлении пароля. Если смотреть еще глубже, то возникают понятия Application Logic и Business Logic, а затем и Service Layer. Если вам интересно, то прочитайте про них самостоятельно.</p>
19 <p>Например, сложно сразу определить, к чему относится отправка письма при регистрации, авторизации или восстановлении пароля. Если смотреть еще глубже, то возникают понятия Application Logic и Business Logic, а затем и Service Layer. Если вам интересно, то прочитайте про них самостоятельно.</p>
20 <p>Самая большая сложность в коде находится именно в этой части приложения. У модели нет четкой структуры, это не классическое запрос-обработка-ответ. Моделирование предметной области - это довольно сложная тема.</p>
20 <p>Самая большая сложность в коде находится именно в этой части приложения. У модели нет четкой структуры, это не классическое запрос-обработка-ответ. Моделирование предметной области - это довольно сложная тема.</p>
21 <p>Взаимоотношения между слоями в MVC не менее важны, чем их наличие. Модель живет своей жизнью и не знает про существование контроллера или представления. Последние используют модель для запуска бизнес-логики или для формирования HTTP-ответа.</p>
21 <p>Взаимоотношения между слоями в MVC не менее важны, чем их наличие. Модель живет своей жизнью и не знает про существование контроллера или представления. Последние используют модель для запуска бизнес-логики или для формирования HTTP-ответа.</p>
22 <p>Контроллер инициирует различные процессы и запуск бизнес-логики. Еще он отвечает за формирование ответа и запускает рендеринг шаблонов. Шаблоны не знают про существование слоя контроллера, но используют данные, которые предоставлены им, чтобы формировать, например, HTML или JSON.</p>
22 <p>Контроллер инициирует различные процессы и запуск бизнес-логики. Еще он отвечает за формирование ответа и запускает рендеринг шаблонов. Шаблоны не знают про существование слоя контроллера, но используют данные, которые предоставлены им, чтобы формировать, например, HTML или JSON.</p>
23 <h3>View</h3>
23 <h3>View</h3>
24 <p><strong>View</strong>или<strong>представление</strong>- это HTML-шаблон, который возвращает сервер после обработки запроса. Если запрос обрабатывается корректно, мы получим веб-страницу. Если запрос некорректный, мы попадем на страницу ошибки 404.</p>
24 <p><strong>View</strong>или<strong>представление</strong>- это HTML-шаблон, который возвращает сервер после обработки запроса. Если запрос обрабатывается корректно, мы получим веб-страницу. Если запрос некорректный, мы попадем на страницу ошибки 404.</p>
25 <p>У шаблонов также есть свой язык, как Jinja2, который позволяет использовать циклы, условия, обрабатывать данные в шаблоне. Несмотря на широкие возможности языка шаблонов, не надо ими злоупотреблять, например, делать вызовы внешних функций или сложные преобразования данных. Все вычисления в модели MVC принято делать на стороне контроллеров, тогда как представление должно уже получать сформированные данные.</p>
25 <p>У шаблонов также есть свой язык, как Jinja2, который позволяет использовать циклы, условия, обрабатывать данные в шаблоне. Несмотря на широкие возможности языка шаблонов, не надо ими злоупотреблять, например, делать вызовы внешних функций или сложные преобразования данных. Все вычисления в модели MVC принято делать на стороне контроллеров, тогда как представление должно уже получать сформированные данные.</p>
26 <p>Еще одна частая ошибка - формирование отображения данных в контроллере, а не на стороне представления. Словом, если вывод требует, например, обрезать строку до 100 символов, то за эту логику отвечает именно слой представления.</p>
26 <p>Еще одна частая ошибка - формирование отображения данных в контроллере, а не на стороне представления. Словом, если вывод требует, например, обрезать строку до 100 символов, то за эту логику отвечает именно слой представления.</p>
27 <h3>Controller</h3>
27 <h3>Controller</h3>
28 <p>Под<strong>контроллерами</strong>понимаются обработчики запросов. Они принимают объект запроса и возвращают объект ответа. В случае Flask, контроллеры представлены функциями, но это не обязательно. В больших фреймворках контроллер - это класс, а обработчики - его методы. Эти методы обычно называют<strong>действиями</strong>- actions. При таком подходе вся логика сосредоточена в самих контроллерах, что вполне допустимо в самых примитивных случаях.</p>
28 <p>Под<strong>контроллерами</strong>понимаются обработчики запросов. Они принимают объект запроса и возвращают объект ответа. В случае Flask, контроллеры представлены функциями, но это не обязательно. В больших фреймворках контроллер - это класс, а обработчики - его методы. Эти методы обычно называют<strong>действиями</strong>- actions. При таком подходе вся логика сосредоточена в самих контроллерах, что вполне допустимо в самых примитивных случаях.</p>