← Назад к вопросам

Что такое жирная модель?

2.4 Senior🔥 181 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Жирная модель

Жирная модель (fat model) — это паттерн архитектуры приложения, в котором большая часть бизнес-логики сосредоточена в моделях данных, а слой представления (view) и контроллеры остаются максимально простыми. Это противоположность тощей модели (thin model), где логика разделена между разными слоями.

Характеристики жирной модели

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

  • Логика находится в одном месте — её проще тестировать
  • Переиспользование логики между разными частями приложения
  • Модель становится основным источником правил бизнеса
  • Упрощает разработку REST API — вся логика уже в модели

Недостатки:

  • Модели становятся сложными и трудными для поддержки
  • Нарушение принципа Single Responsibility Principle (SRP)
  • Сложнее масштабировать приложение
  • Модель смешивает разные уровни абстракции

Пример жирной модели

class User:
    def __init__(self, name: str, email: str):
        self.name = name
        self.email = email
    
    def validate_email(self) -> bool:
        """Валидация email"""
        return "@" in self.email and "." in self.email
    
    def send_welcome_email(self) -> None:
        """Отправка приветственного письма"""
        if self.validate_email():
            # Логика отправки
            print(f"Письмо отправлено на {self.email}")
    
    def calculate_discount(self, purchase_amount: float) -> float:
        """Расчёт скидки"""
        if purchase_amount > 1000:
            return purchase_amount * 0.1
        return 0
    
    def process_registration(self) -> bool:
        """Полная обработка регистрации"""
        if not self.validate_email():
            return False
        self.send_welcome_email()
        return True

Пример тощей модели (противоположность)

from dataclasses import dataclass

@dataclass
class User:
    """Модель содержит только данные"""
    name: str
    email: str

class EmailValidator:
    @staticmethod
    def validate(email: str) -> bool:
        return "@" in email and "." in email

class EmailService:
    @staticmethod
    def send_welcome(user: User) -> None:
        if EmailValidator.validate(user.email):
            print(f"Письмо отправлено на {user.email}")

class DiscountCalculator:
    @staticmethod
    def calculate(purchase_amount: float) -> float:
        if purchase_amount > 1000:
            return purchase_amount * 0.1
        return 0

class RegistrationService:
    def __init__(self, validator: EmailValidator, email_service: EmailService):
        self.validator = validator
        self.email_service = email_service
    
    def register(self, user: User) -> bool:
        if not self.validator.validate(user.email):
            return False
        self.email_service.send_welcome(user)
        return True

Баланс на практике

В реальных проектах используется сбалансированный подход:

  • Модель содержит: валидацию, основные методы расчёта, работу с собственным состоянием
  • Сервисы содержат: координацию нескольких моделей, интеграцию с внешними сервисами, бизнес-процессы
  • Контроллеры содержат: обработку HTTP-запросов, преобразование данных
class User:
    """Модель с умеренным количеством логики"""
    def __init__(self, name: str, email: str):
        self.name = name
        self.email = email
    
    def is_valid(self) -> bool:
        """Только валидация своего состояния"""
        return "@" in self.email

class UserService:
    """Сервис координирует логику"""
    def __init__(self, email_service: EmailService):
        self.email_service = email_service
    
    def register(self, name: str, email: str) -> User:
        user = User(name, email)
        if not user.is_valid():
            raise ValueError("Invalid email")
        self.email_service.send_welcome(user)
        return user

Когда использовать жирную модель

  • Для простых CRUD приложений с малым объёмом логики
  • Прототипирование и MVP
  • Когда нужна скорость разработки

Когда избегать

  • Большие enterprise системы
  • Когда логика повторяется в разных местах
  • Когда нужна высокая тестируемость
  • Микросервисная архитектура

В Python-сообществе чаще используется сбалансированный подход — модели содержат бизнес-логику, но сложная координация делегируется сервисам и использованным паттернам (Repository, Factory и т.д.).

Что такое жирная модель? | PrepBro