Есть ли место для объектов значений в модели предметной области с источником событий?
Давайте определим объект значения как объект с неизменяемым состоянием, которое защищает его инварианты и не имеет определенного идентификатора.
Модель домена источника событий в этом контексте - это домен, который полностью или частично является источником событий, что означает, что его текущее состояние может быть получено путем применения всех событий, которые произошли в прошлом. Сами события считаются неизменными даже во времени.
Состоялись дебаты по поводу допустимости использования объектов значений в событиях - этот вопрос идет немного дальше: есть ли вообще место для объектов значений в доменах с источником событий вообще?
(Потенциальная) проблема с использованием объектов-значений состоит в том, что становится довольно сложно изменить предметную область таким образом, чтобы инварианты были ужесточены.
Примером этого сценария может быть объект со значением Username
с единственным ограничением: имя должно содержать от 2 до 16 символов.
Хотя это уже некоторое время работает хорошо, компания решает разрешить имена пользователей не менее 5 символов. Начинается период миграции, и пользователей с именами менее 5 символов просят обновить свои имена.
Допустим, процесс прошел успешно, применяются корректирующие события, и все довольны. Мы ужесточили ограничения для нашего объекта Username
value, чтобы он требовал не менее 5 символов.
Какое-то время все довольны, но затем мы обнаруживаем проблему со снимками и воспроизводим все события.
Теперь мы сталкиваемся с исключением из нашего Username
объекта: загружая исторические данные, мы нарушаем инвариант нашего домена.
Правила объектов значения применяются задним числом - делает ли это их по своей сути непригодными для поиска событий? Стоит ли применять управление версиями объектов значений? Есть ли более простой способ избежать таких проблем?