Что такое паттерн MVC?

«Что такое паттерн MVC?» — вопрос из категории Архитектура, который задают на 32% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MVC (Model-View-Controller) — это архитектурный паттерн для разделения ответственности в приложении, особенно в веб-разработке. Он структурирует код на три взаимосвязанных компонента: * **Model (Модель):** Представляет данные и бизнес-логику приложения. Отвечает за доступ к данным (БД, API), валидацию и основные правила предметной области. * **View (Представление):** Отвечает за отображение данных пользователю (UI). Это пассивный компонент, который получает данные от контроллера и рендерит их (HTML, JSON и т.д.). * **Controller (Контроллер):** Обрабатывает пользовательский ввод (HTTP-запросы). Получает данные от модели и передаёт их в представление. Является посредником между Model и View. **Поток данных в ASP.NET Core MVC:** 1. Пользователь отправляет запрос (например, `/Products/Index`). 2. Маршрутизатор направляет запрос в соответствующий контроллер и действие (`ProductController.Index()`). 3. Контроллер взаимодействует с моделью (например, получает список товаров из БД). 4. Контроллер выбирает представление и передаёт ему модель. 5. Представление рендерит окончательный HTML-ответ. **Пример кода на C# (ASP.NET Core):** ```csharp // Model (обычно находится в папке Models/) public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } } // Controller (ProductController.cs) public class ProductController : Controller { private readonly IProductRepository _repository; public ProductController(IProductRepository repository) // DI { _repository = repository; } public IActionResult Index() { // 1. Получаем данные из модели List products = _repository.GetAllProducts(); // 2. Передаём данные в представление return View(products); } } // View (Views/Product/Index.cshtml) @model List

Список товаров

@foreach (var product in Model) {
@product.Name - @product.Price руб.
} ``` **Преимущества паттерна:** * **Разделение ответственности:** Каждый компонент выполняет свою чёткую задачу. * **Удобство тестирования:** Модель и контроллер можно тестировать отдельно от UI. * **Параллельная разработка:** Разные разработчики могут работать над Model, View и Controller одновременно. **Недостатки и эволюция:** * **"Толстый" контроллер:** Со временем контроллеры могут обрасти логикой, которую лучше вынести в отдельные сервисы. * **Сложность для современных SPA:** Для frontend-приложений на React/Angular/Vue паттерны вроде MVVM или чистые API (REST/gRPC) могут быть более уместны. MVC является фундаментальным паттерном, на основе которого строятся более сложные архитектуры.