У меня есть объект электронной почты с двумя свойствами, меткой и значением. Пользователям системы необходимо проверить их электронную почту, прежде чем они смогут использовать ее в системе. Процесс проверки очень прост:Свойства объекта домена и инкапсуляция
- Установить код активации для электронной почты
- Отправить письмо с кодом активации, чтобы убедиться, что электронная почта является действительной
объекта электронной почты выглядит следующим образом :
class Email {
String label
String value
EmailStatus status
String activationCode
boolean requestVerification() {
// Set the activationCode that will be refereced to change the email status
this.activationCode = UUID
// Raise an event to send a notification email by a communication service
EventManager.fire('emailVerificationRequest',this)
}
Все работает нормально, за исключением того, что свойство activationCode не кажется правильным в объекте электронной почты. В любом случае он не описывает состояние объекта и используется только в процессе проверки электронной почты. Поэтому я изменил свой код, чтобы ввести новый объект ActivationToken. Объект будет использоваться для инкапсуляции кода активации. Вот новая версия объекта электронной почты
class Email {
String label
String value
EmailStatus status
boolean requestVerification() {
new ActivationToken(target:this,code:UUID,expiryDate:new Date()).save()
// Raise an event to send a notification email by a communication service
EventManager.fire('emailVerificationRequest',this)
}
class ActivationToken {
Email target
String code
Date expiryDate
}
- Является ли это звук домен дизайн или я усложняя свой объект даром
- ли метод requestVerification относится к объекту электронной почты в первой очереди или же она должна быть размещены в другом месте; в сервисе или внутри процесса.
- Есть ли шаблон дизайна, который я могу следить, чтобы решать подобные проблемы
Update
Я хотел объяснить, почему я сохранил метод requestVerfication часть объекта домена электронной почты, даже после того, как второй рефакторинга подход.
У меня есть удаленный интерфейс, который взаимодействует непосредственно с объектами домена через диспетчер следующий образом:
remote://email/6/do/requestVerification
Первоначально я хотел сохранить все связи с бэкэндом направляемого через объекты домена, и если есть необходимо взаимодействовать, скажем, с сервисом, который я использовал IOC, чтобы ввести его в объект домена и использовать объект домена в качестве прокси. Разделение между удаленным интерфейсом и объектом домена выглядело чистым, но оказалось, что это очень плохая идея, так как она блокирует дизайн домена и вводит бесполезную зависимость от внешнего объекта (в данном случае EmailVerificationService), который не имеет ничего общего с поведением или государственные аспекты предметной области
другое решение, чтобы решить эту проблему можно было бы держать метод requestVerification в службе, где он, естественно, принадлежит и ввести новый синтаксис для протокола обмена данными, такие как:
remote://service/email/do/requestVerification
Ребята, что вы думаете ?
Спасибо
Кен
Пожалуйста, ознакомьтесь с обновлением моего вопроса, объясняющего причину, по которой я не выбрал сервисный подход в первую очередь. Вы очень цените комментарии. Спасибо – ken