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