[Use Case в DDD: как проектировать сценарии взаимодействия с системой]
Привет! Сегодня поговорим про Use Case (Сценарии использования) — один из ключевых элементов DDD и чистой архитектуры.
1. Что такое Use Case?
Use Case (Сценарий использования) — это:
✔️ Описание конкретного бизнес-действия (например, "Оформление заказа", "Отмена бронирования").
✔️ Изолированная логика, которая координирует работу домена и инфраструктуры.
✔️ Мост между presentation (API/UI) и domain (бизнес-правила).
Примеры:
2. Где находятся Use Case в структуре проекта?
Они относятся к application-слою (слое приложения):
3. Пример use case "Создание заказа"
4. Почему Use Case — это важно?
- Чёткое разделение ответственности
Presentation-слой (API/CLI) не должен содержать бизнес-логику.
Domain-слой не должен знать о внешних сервисах (API, БД).
- Упрощение тестирования
Use Case можно тестировать изолированно, подменяя репозитории на заглушки.
- Гибкость
Один Use Case может быть вызван из разных мест: API, CLI, фоновой задачи.
- Документирование системы
Названия Use Cases (CreateOrder, CancelBooking) явно описывают, что делает система.
5. Типичные ошибки
❌ Use Case = "God Object"
Не нужно пихать всю логику в один Use Case. Разбивайте на мелкие сценарии.
❌ Логика в контроллерах
Код вида
#DDD #UseCase #CleanArchitecture #Python
Привет! Сегодня поговорим про Use Case (Сценарии использования) — один из ключевых элементов DDD и чистой архитектуры.
1. Что такое Use Case?
Use Case (Сценарий использования) — это:
✔️ Описание конкретного бизнес-действия (например, "Оформление заказа", "Отмена бронирования").
✔️ Изолированная логика, которая координирует работу домена и инфраструктуры.
✔️ Мост между presentation (API/UI) и domain (бизнес-правила).
Примеры:
CreateOrderUseCase
→ создание заказа.CancelBookingUseCase
→ отмена бронирования.ProcessPaymentUseCase
→ обработка платежа.2. Где находятся Use Case в структуре проекта?
Они относятся к application-слою (слое приложения):
src/
├── domain/
├── application/ # Use Cases + Application Services/CQS
│ ├── use_cases/
│ │ ├── commands/
│ │ └── queries/
│ └── services/
├── infrastructure/
└── api/
3. Пример use case "Создание заказа"
# /delivery/core/application/use_cases/commands/create_order/create_order_handler.py
from dataclasses import dataclass
from core.domain.model.order_aggregate.order import Order
from core.domain.model.shared_kernel.location import Location
from core.application.use_cases.commands.create_order.create_order_command import CreateOrderCommand
from infrastructure.adapters.postgres.unit_of_work import UnitOfWork
@dataclass
class CreateOrderCommandHandler:
unit_of_work: UnitOfWork
def handle(self, massege: CreateOrderCommand) -> None:
# Получаем геопозицию из Geo (пока ставим рандомное значение)
location = Location.create_random_location()
# Создаем заказ
order = Order(
order_id=massege.basket_id, # ID заказа совпадает с ID корзины
location=location
)
# Сохраняем
with self.unit_of_work as uow:
uow.orders.add(order)
4. Почему Use Case — это важно?
- Чёткое разделение ответственности
Presentation-слой (API/CLI) не должен содержать бизнес-логику.
Domain-слой не должен знать о внешних сервисах (API, БД).
- Упрощение тестирования
Use Case можно тестировать изолированно, подменяя репозитории на заглушки.
- Гибкость
Один Use Case может быть вызван из разных мест: API, CLI, фоновой задачи.
- Документирование системы
Названия Use Cases (CreateOrder, CancelBooking) явно описывают, что делает система.
5. Типичные ошибки
❌ Use Case = "God Object"
Не нужно пихать всю логику в один Use Case. Разбивайте на мелкие сценарии.
❌ Логика в контроллерах
Код вида
if user.is_admin: ...
должен быть в Use Case или домене, не в API.#DDD #UseCase #CleanArchitecture #Python