Найти в Дзене
KIT

Когда сущности оживают: применение State в доменной модели DDD

Сущность в Domain Driven Design — это сердце бизнес-логики. Ее цель - моделирование бизнес-процессов и их жизненного цикла. Сущность инкапсулирует состояние и поведение важное для бизнеса. Очень часто в DDD поведение сущности, доступные операции и бизнес-правила начинают определяться через состояние самого объекта. При использовании традиционной "плоской" структуры методы изменения состояния объекта начинают содержать множество условных операторов (if-else, switch). Проверки состояния объекта дублируются в каждом методе. Также со временем сущность превращается в God-object - огромные классы, внутри которых находится вся логика поведения. Выход: использование паттерна State для управления поведением сущности! State позволяет "извлечь" состояние сущности в отдельные классы, каждый из которых инкапсулирует своё поведение и валидные переходы. Результат? Читаемый, безопасный и легко тестируемый код доменной модели. ⮞ Ясность бизнес-логики - убираем нарушение принципа Single Responsibility.
Оглавление

Сущность в Domain Driven Design — это сердце бизнес-логики. Ее цель - моделирование бизнес-процессов и их жизненного цикла. Сущность инкапсулирует состояние и поведение важное для бизнеса.

Очень часто в DDD поведение сущности, доступные операции и бизнес-правила начинают определяться через состояние самого объекта. При использовании традиционной "плоской" структуры методы изменения состояния объекта начинают содержать множество условных операторов (if-else, switch). Проверки состояния объекта дублируются в каждом методе. Также со временем сущность превращается в God-object - огромные классы, внутри которых находится вся логика поведения.

Выход: использование паттерна State для управления поведением сущности! State позволяет "извлечь" состояние сущности в отдельные классы, каждый из которых инкапсулирует своё поведение и валидные переходы. Результат? Читаемый, безопасный и легко тестируемый код доменной модели.

Преимущества использования состояния

⮞ Ясность бизнес-логики - убираем нарушение принципа Single Responsibility. Сущность делегирует поведение Состоянию. Каждый State отвечает только за свое состояние.

⮞ Защита от недопустимых состояний - объект не перейдет в недопустимое состояние, все переходы контроллируются на уровне модели. Переход - это всегда явная операция.

⮞ Легко тестировать - каждое состояние это небольшой класс, выполняющий одно действие. И поэтому легко тестируются независимо друг от друга.

⮞ Просто расширять - добавление нового состояния это просто добавление нового класса и нескольких переходов.

Когда стоит использовать State вместе с Domain Entity

🠶 Система имеет четкие ограниченные состояния

🠶 Поведение сильно зависит от состояния

🠶 Сложный жизненный цикл с множеством переходов

🠶 Планируется расширение логики

Итог

Использование State при реализации Entity позволит создать читаемую и безопасную доменную модель. Это способ придать доменной модели структуру, сделать её предсказуемой и устойчивой к росту сложности.

Что думаете по этому поводу? Использовали State в Entity?

Полный текст статьи с примерами кода ищи в моем телеграм-канале

#designpatterns #statepattern #DomainDrivenDesign #DDD