HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Архитектура веб-приложений в первую очередь определяется самой природой веба, тем, как работает HTTP. Последовательность<strong>"запрос-обработка-ответ"</strong>- базис, на который нанизывается все остальное.</p>
1 <p>Архитектура веб-приложений в первую очередь определяется самой природой веба, тем, как работает HTTP. Последовательность<strong>"запрос-обработка-ответ"</strong>- базис, на который нанизывается все остальное.</p>
2 <p>Фреймворки идут дальше и разделяют приложение на дополнительные слои уже внутри самого процесса обработки запроса. Такое разделение напрашивается само собой, без него код быстро превращается в мешанину из запросов к базе данных, формирований HTML и логики обработки данных. Именно о таком разделении мы поговорим в этом уроке.</p>
2 <p>Фреймворки идут дальше и разделяют приложение на дополнительные слои уже внутри самого процесса обработки запроса. Такое разделение напрашивается само собой, без него код быстро превращается в мешанину из запросов к базе данных, формирований HTML и логики обработки данных. Именно о таком разделении мы поговорим в этом уроке.</p>
3 <h2>Что такое MVC</h2>
3 <h2>Что такое MVC</h2>
4 <p>Структура приложения часто состоит из трех слоев. Из обработки запроса естественным образом выделяется слой шаблонов, на основе которых генерируется HTML. Этот слой принято называть<strong>View</strong>- "представление".</p>
4 <p>Структура приложения часто состоит из трех слоев. Из обработки запроса естественным образом выделяется слой шаблонов, на основе которых генерируется HTML. Этот слой принято называть<strong>View</strong>- "представление".</p>
5 <p>Кроме него, выделяют еще два слоя:</p>
5 <p>Кроме него, выделяют еще два слоя:</p>
6 <ul><li><strong>Model</strong>- модель</li>
6 <ul><li><strong>Model</strong>- модель</li>
7 <li><strong>Controller</strong>- контроллер</li>
7 <li><strong>Controller</strong>- контроллер</li>
8 </ul><p>Остальное добавляется по мере роста сложности приложения.</p>
8 </ul><p>Остальное добавляется по мере роста сложности приложения.</p>
9 <p>Три основных слоя складываются в аббревиатуру<strong>MVC</strong>(<em>Model-View-Controller</em>):</p>
9 <p>Три основных слоя складываются в аббревиатуру<strong>MVC</strong>(<em>Model-View-Controller</em>):</p>
10 <p>Именно об этом мы поговорим в этом уроке.</p>
10 <p>Именно об этом мы поговорим в этом уроке.</p>
11 <p>Архитектурный шаблон MVC задает основную структуру приложения и позволяет коду развиваться, оставаясь удобным в поддержке. Шаблон MVC с некоторыми модификациями используется во всех веб-фреймворках. С представлением все понятно, а вот с моделью и контроллером нужно разбираться отдельно.</p>
11 <p>Архитектурный шаблон MVC задает основную структуру приложения и позволяет коду развиваться, оставаясь удобным в поддержке. Шаблон MVC с некоторыми модификациями используется во всех веб-фреймворках. С представлением все понятно, а вот с моделью и контроллером нужно разбираться отдельно.</p>
12 <h2>Как работают контроллеры с точки зрения MVC</h2>
12 <h2>Как работают контроллеры с точки зрения MVC</h2>
13 <p>Под<strong>контроллерами</strong>понимаются обработчики запросов. Они принимают объект запроса и возвращают объект ответа. В случае Javalin, контроллеры представлены анонимными функциями, но это не обязательно. Например, в больших фреймворках контроллер - это класс, а обработчики - его методы. Эти методы обычно именуют<strong>действиями</strong>(<em>actions</em>).</p>
13 <p>Под<strong>контроллерами</strong>понимаются обработчики запросов. Они принимают объект запроса и возвращают объект ответа. В случае Javalin, контроллеры представлены анонимными функциями, но это не обязательно. Например, в больших фреймворках контроллер - это класс, а обработчики - его методы. Эти методы обычно именуют<strong>действиями</strong>(<em>actions</em>).</p>
14 <p>При таком подходе вся логика сосредоточена в самих контроллерах, что допустимо в самых простых случаях. Во всех остальных ситуациях выделяют еще один слой, который называют<strong>моделью</strong>.</p>
14 <p>При таком подходе вся логика сосредоточена в самих контроллерах, что допустимо в самых простых случаях. Во всех остальных ситуациях выделяют еще один слой, который называют<strong>моделью</strong>.</p>
15 <h2>Как работает модель с точки зрения MVC</h2>
15 <h2>Как работает модель с точки зрения MVC</h2>
16 <p>Слой модели отвечает за бизнес-логику приложения и данные, связанные с ней.</p>
16 <p>Слой модели отвечает за бизнес-логику приложения и данные, связанные с ней.</p>
17 <p>Чисто технически, этот слой можно представить разными способами - все зависит от конкретного языка программирования и используемых библиотек. Самый распространенный вариант - это ORM, но так бывает не всегда. Более того, довольно часто часть логики все же проникает в контроллеры, даже при наличии отдельного слоя модели.</p>
17 <p>Чисто технически, этот слой можно представить разными способами - все зависит от конкретного языка программирования и используемых библиотек. Самый распространенный вариант - это ORM, но так бывает не всегда. Более того, довольно часто часть логики все же проникает в контроллеры, даже при наличии отдельного слоя модели.</p>
18 <p>Зачем выделять отдельный слой модели? Дело в том, что внутри нашего сайта мы реализуем какую-то предметную область, которая никак не связана с сайтом и используемым фреймворком.</p>
18 <p>Зачем выделять отдельный слой модели? Дело в том, что внутри нашего сайта мы реализуем какую-то предметную область, которая никак не связана с сайтом и используемым фреймворком.</p>
19 <p>Для примера возьмем сайт для бухгалтеров. Если мы решим создавать сайт на каком-то конкретном фреймворке, это никак не повлияет на правила бухгалтерии. Другими словами, бизнес-правила бухгалтерии никак не связаны с программированием. Программисты просто выражают предметную область в виде кода.</p>
19 <p>Для примера возьмем сайт для бухгалтеров. Если мы решим создавать сайт на каком-то конкретном фреймворке, это никак не повлияет на правила бухгалтерии. Другими словами, бизнес-правила бухгалтерии никак не связаны с программированием. Программисты просто выражают предметную область в виде кода.</p>
20 <p>Такое разделение предметной области и программирования влияет на структуру кода. Теоретически, внутри сайта мы можем выделить два слоя кода:</p>
20 <p>Такое разделение предметной области и программирования влияет на структуру кода. Теоретически, внутри сайта мы можем выделить два слоя кода:</p>
21 <ul><li>Первый обрабатывает веб-запросы</li>
21 <ul><li>Первый обрабатывает веб-запросы</li>
22 <li>Второй описывает предметную область и позволяет с ней работать</li>
22 <li>Второй описывает предметную область и позволяет с ней работать</li>
23 </ul><p>В идеальном случае мы можем взять второй слой и перенести его в другой фреймворк без изменений. Но на практике провести эту границу очень сложно. Например, к чему относится отправка письма при регистрации, авторизация или восстановление пароля?</p>
23 </ul><p>В идеальном случае мы можем взять второй слой и перенести его в другой фреймворк без изменений. Но на практике провести эту границу очень сложно. Например, к чему относится отправка письма при регистрации, авторизация или восстановление пароля?</p>
24 <p>Эта часть приложения - самая большая сложность в коде. Модель не имеет никакой четкой структуры, это не классическое "запрос-обработка-ответ". Моделирование предметной области - довольно сложная тема, на почве которой произойдет еще немало споров.</p>
24 <p>Эта часть приложения - самая большая сложность в коде. Модель не имеет никакой четкой структуры, это не классическое "запрос-обработка-ответ". Моделирование предметной области - довольно сложная тема, на почве которой произойдет еще немало споров.</p>
25 <p>Взаимоотношения между слоями в MVC не менее важны, чем наличие самих слоев:</p>
25 <p>Взаимоотношения между слоями в MVC не менее важны, чем наличие самих слоев:</p>
26 <p>Опишем эту схему подробнее:</p>
26 <p>Опишем эту схему подробнее:</p>
27 <ul><li>Модель живет своей жизнью, ничего не зная о существовании контроллера или представления. Остальные слои MVC используют ее для запуска бизнес-логики или формирования HTTP-ответа</li>
27 <ul><li>Модель живет своей жизнью, ничего не зная о существовании контроллера или представления. Остальные слои MVC используют ее для запуска бизнес-логики или формирования HTTP-ответа</li>
28 <li>Контроллер инициирует различные процессы - запускает бизнес-логику, отвечает за формирование ответа и запускает рендеринг шаблонов</li>
28 <li>Контроллер инициирует различные процессы - запускает бизнес-логику, отвечает за формирование ответа и запускает рендеринг шаблонов</li>
29 <li>Представление ничего не знает о других слоях, но использует данные от контроллера для формирования HTML, JSON или тому подобного</li>
29 <li>Представление ничего не знает о других слоях, но использует данные от контроллера для формирования HTML, JSON или тому подобного</li>
30 </ul>
30 </ul>