У меня есть объект электронной почты с двумя свойствами: меткой и значением. Пользователь системы должен подтвердить свою электронную почту, прежде чем он сможет использовать ее в системе. Процесс проверки очень прост:
- Установите код активации для электронной почты
- Отправьте электронное письмо с кодом активации, чтобы убедиться, что электронное письмо действительно.
Объект электронной почты выглядит следующим образом:
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 не подходит для объекта Email. Он никоим образом не описывает состояние объекта и используется только в процессе проверки электронной почты. Поэтому я изменил свой код, включив в него новый объект под названием 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 объекту Email в первую очередь или его следует разместить в другом месте; в службе или в процессе.
- Есть ли какой-либо шаблон проектирования, которому я могу следовать для решения подобных проблем?
Обновить
Я хотел объяснить, почему я сохранил метод requestVerfication частью объекта домена электронной почты даже после второго подхода к рефакторингу.
У меня есть удаленный интерфейс, который напрямую взаимодействует с объектами домена через диспетчер следующим образом:
remote://email/6/do/requestVerification
Первоначально я хотел, чтобы вся связь с серверной частью направлялась через объекты домена, и если есть необходимость взаимодействовать, скажем, со службой, которую я использовал IOC, чтобы внедрить ее в объект домена и использовать объект домена в качестве прокси. Разделение между удаленным интерфейсом и объектом домена выглядело четким, но это оказалось очень плохой идеей, так как оно нарушает дизайн домена и вводит бесполезную зависимость от внешнего объекта (в данном случае EmailVerificationService ), который не имеет ничего общего с поведением или аспекты состояния доменного объекта
Другим решением для решения этой проблемы может быть сохранение метода requestVerification в службе, которой он естественно принадлежит, и введение нового синтаксиса в протокол связи, например:
remote://service/email/do/requestVerification
Ребята, что вы думаете ?
Спасибо
-кен