我有一個Email對象有兩個屬性,標籤和值。系統用戶需要驗證他們的電子郵件,然後才能在系統中使用它。驗證過程非常簡單:域對象屬性和封裝
- 設置了電子郵件
- 激活碼發送一封電子郵件,激活碼驗證電子郵件是有效的
電子郵件對象如下所示:
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的新對象。該對象將用於封裝activationCode。這裏的電子郵件對象
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
你們有什麼感想 ?
謝謝
-Ken
請參閱我的問題的更新,解釋爲什麼我沒有選擇服務方法的原因。您的意見非常感謝。謝謝 – ken 2010-09-03 14:34:09