Что такое архитектурный паттерн Model-View-Controller (MVC)?

«Что такое архитектурный паттерн Model-View-Controller (MVC)?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

**Model-View-Controller (MVC)** — это архитектурный паттерн, разделяющий ответственность в приложении на три взаимосвязанных компонента для улучшения организации кода, тестируемости и поддержки. **Роли компонентов:** 1. **Model (Модель):** * **Что это:** Представляет бизнес-данные, правила и логику приложения. Это "истина" о предметной области. * **Ответственность:** Получение/сохранение данных, валидация, бизнес-вычисления. * **Важно:** Модель НЕ знает о View и Controller. 2. **View (Представление):** * **Что это:** Визуальное отображение данных модели (UI). Это может быть HTML-страница, график, таблица. * **Ответственность:** Отображение данных, полученных от модели, в удобном для пользователя формате. Обычно пассивна и не содержит бизнес-логики. * **Важно:** View наблюдает за изменениями модели (часто через шаблон Наблюдатель). 3. **Controller (Контроллер):** * **Что это:** Посредник между пользователем (через View), Model и другими сервисами. * **Ответственность:** Обработка пользовательского ввода (запросы, клики), вызов соответствующих методов модели для изменения состояния, обновление View. **Поток данных:** 1. Пользователь взаимодействует с **View** (нажимает кнопку). 2. **View** передает действие **Controller**. 3. **Controller** обрабатывает входные данные, взаимодействует с **Model** (обновляет/запрашивает). 4. **Model** изменяет свое состояние и уведомляет об этом все подписанные **View** (или Controller обновляет View). 5. **View** получает обновленные данные от Model и перерисовывается. **Пример на Python (упрощенный веб-фреймворк):** ```python # Model (business logic/data) class UserModel: def __init__(self): self.users = {} def get_user(self, user_id): return self.users.get(user_id) def add_user(self, user_id, name): self.users[user_id] = {'name': name} # View (presentation layer - could be a template) class UserView: def render_user_profile(self, user_data): if user_data: return f"

Profile: {user_data['name']}

" else: return "

User not found

" # Controller (request handler) class UserController: def __init__(self, model, view): self.model = model self.view = view def handle_request(self, user_id): # 1. Interact with Model user_data = self.model.get_user(user_id) # 2. Update View return self.view.render_user_profile(user_data) # Usage model = UserModel() view = UserView() controller = UserController(model, view) model.add_user(1, "Alice") print(controller.handle_request(1)) # Output:

Profile: Alice

``` **Преимущества:** * **Разделение ответственности:** Упрощает разработку и тестирование каждого компонента по отдельности. * **Повторное использование:** Модель можно использовать с разными View (веб, мобильное, API). * **Параллельная разработка:** Разные разработчики могут работать над Model, View и Controller. **Недостатки/Сложности:** * **Усложнение для простых UI:** Избыточность для тривиальных задач. * **"Раздутый" Controller:** В сложных сценариях Controller может превратиться в "божественный объект", содержащий слишком много логики. Для борьбы с этим существуют производные паттерны (MVVM, MVP).