多型, DDD如何體現

willem發表於2008-10-15

Account類有withdraw, deposit兩個方法,是放在Account類的裡面還是外面?
方案一:
Account代表我的賬戶,代表我的一個身份,那麼當然是一個主動的物件。
Account取錢,存錢是裡所當然的。withdraw, deposit兩個方法應該是Account的方法。呼叫方法:

account.withdraw(money) 
account.deposit(money) 
<p class="indent">

方案二:
Account就是戶頭,就是一個被動的金額資料記錄。
User每次申請銀行管理機構(出納),AccountManager來操作這個Account。
呼叫方法:

AccountManager.withdraw(account, money) 
AccountManager.deposit(account, money) 
<p class="indent">


如果只存在一種Account型別的情況下(比如只有銀行櫃檯賬戶),那麼程式設計上沒有根本的區別。只是這個加錢、減錢的動作的位置不同 -- 是在Account裡面做,還是在AccountManager裡面做。

在有多個Account型別的情況下,那情況就大不一樣了。
比如,有電子信用卡遠端帳戶 ECardAccount,有櫃檯存摺賬戶PaperAccount。這兩種賬戶的業務規則都是不同的。
比如,電子信用卡遠端帳戶的取錢,要收取一定比率的手續費,而櫃檯存摺賬戶就不需要。

這個時候,兩種劃分方法的程式設計上的優劣,就體現出來了。
按照第一種方案,只要為相同的Account介面,實現兩個不同的類,ECardAccount,PaperAccount,分別實現不同的withdraw,deposit就可以了。
第二種方法,就有些麻煩了。需要在AccountManager裡面用一個 if else,或者switch來判斷Account的型別,是ECard信用卡,還是Paper存摺。

這兩個方法都涉及到資料庫的操作。

各位,如果是DDD,怎麼處理?

相關文章