В чем разница между Инвариантами и Правилами валидации?

Я часто вижу термин Инварианты в DDD. Здесь Дино Эспозито говорит об этом. Если я посмотрю на библиотеку .NET, я вижу класс ValidationAttribute. Являются ли Инварианты и правилами проверки одинаковыми? Например, могу ли я сказать, что скидка 50% доступна только в том случае, если общая сумма заказа более 250 долларов является инвариантной?

Или они отличаются от того, где Инварианты должны защитить объект от недействительности, а проверка заключается в проверке действительности объекта даже после того, как он изменил его состояние (он может находиться в допустимом или недействительном состоянии)? В приведенном выше примере, если я использую инварианты, я проверяю инвариант перед обновлением скидки, а в случае проверки я применяю 50% скидку, а затем проверяю на достоверность (объект уже находится в недопустимом состоянии).

Ответ 1

Абсолютно, валидация - это процесс утверждения данного состояния объекта, в то время как инвариантное принудительное выполнение происходит до того, как это состояние уже достигнуто.

Следствие состоит в том, что инвариантное принудительное исполнение лучше всего исполняется вещью, которая сама мутируется (или создается), как рефлекс самозащиты, тогда как проверка обычно выполняется третьей стороной.

Всегда действующая школа мысли защищает использование инвариантов над валидацией. Я думаю, что он отлично подходит для DDD и Aggregates.

Ответ 2

Да, я так думаю

В DDD правила проверки могут рассматриваться как инварианты. Основная ответственность агрегата заключается в применении инвариантов при изменении состояния для всех объектов в этом агрегате.

Вы можете сослаться больше информации на этой странице