Что такое паттерн ‘Толстая модель, тонкий контроллер’ (Fat Model, Skinny Controller)

Ответ

'Толстая модель, тонкий контроллер' (Fat Model, Skinny Controller) — это архитектурный паттерн, при котором основная бизнес-логика приложения концентрируется в моделях, а контроллеры остаются максимально 'тонкими', выполняя только задачи по обработке HTTP-запросов и вызову методов моделей.

Этот подход противопоставляется 'Тонкой модели', где логика размазана по контроллерам или сервисным слоям, что может привести к дублированию кода и усложнению тестирования.

Пример (Python/Django-like):

# models.py - "Толстая" модель с бизнес-логикой
class Order:
    def __init__(self, items, status='new'):
        self.items = items
        self.status = status

    def calculate_total(self):
        # Логика подсчета суммы заказа
        return sum(item.price for item in self.items)

    def confirm_payment(self):
        # Логика изменения статуса
        if self.status == 'new':
            self.status = 'paid'
            # ... отправить уведомление
            return True
        return False

# controllers.py - "Тонкий" контроллер
def process_order_payment(request):
    order_id = request.POST.get('order_id')
    order = Order.objects.get(id=order_id) # Получаем модель

    # Делегируем всю логику модели
    if order.confirm_payment():
        return http_response("Payment confirmed!")
    else:
        return http_response("Payment failed.", status=400)

Преимущества:

  • Инкапсуляция логики: Бизнес-правила находятся там, где им место — рядом с данными.
  • Повторное использование кода: Методы модели можно легко вызывать из разных частей приложения (контроллеры, фоновые задачи).
  • Упрощение тестирования: Легко тестировать модели в изоляции от веб-контекста.

Недостатки:

  • Риск нарушения SRP: Модели могут стать слишком большими и отвечать за многое (God Object).
  • Сложность: При большом количестве логики модель может стать трудной для понимания.