Важно различать действительные в смысле инвариантов объекта домена (которые всегда должны выполняться) и того, что некоторые люди называют « контекстной проверкой». Например, клиент с отрицательным банком аккаунт "неверный?" Нет, но они не могут быть авторизованы для выполнения определенных видов транзакций. Это контекстная проверка , в отличие от «каждый объект клиента должен иметь ненулевой идентификатор», что в целом является другим типом проверки.
Одним из эффективных методов обеспечения соблюдения инвариантов является разграничение классов, которые представляют вводимые пользователем данные, от объектов домена и не допускающих неограниченных мутаторов (например, простых наборов доступа) к объектам вашего домена.
Например, если у вас есть объект домена Student
, не манипулируйте им напрямую в пользовательском интерфейсе. Вместо создания Student
экземпляров ваши представления создают StudentBuilder
экземпляры, которые моделируют то, что вам нужно для создания действительного Student
объекта домена.
Далее, у вас есть классы, которые проверяют экземпляры компоновщика на соответствие инвариантам объекта домена, и фабрики, которые принимают принимающие компоновщики и могут преобразовать их в действительные объекты домена. (Вы также можете ввести контекстные стратегии проверки на этом шаге в зависимости от ситуации.)