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