在域驅動設計中,強調將行爲置於正確的位置。雖然我並不總是確定究竟是什麼構成「正確的」。當一個域對象被執行時,你如何表示域對象的行爲,而不是actor?
請考慮這種情況:「客戶從銀行賬戶中提取一定數額的資金。」
在語法上,我們有:
'客戶' 是主題
'退出' 是一個動詞
'量' 是直接對象
'帳戶' 是一個影響介詞對象
傳統上,客戶端將執行這樣的:account.withdraw(量)。
這可以被理解爲:「客戶命令一個銀行賬戶提取一筆錢。」然而,這在語法上並不符合原始情況,因爲'銀行賬戶'現在是直接對象和不定式從主要條款中刪除'撤回'和'金額',因此傳達的主要想法是'客戶命令帳戶'。
要堅持DDD,我們應該把這段代碼當作精確描述原始場景。這意味着'提款'方法不會模擬賬戶(該賬戶不是主題)執行的行爲,而是它模擬的行爲是它間接影響它(該賬戶是一個介詞對象),很可能會重命名爲'wasWithdrawnFrom'。此外,該方法自變量表示的東西受着由客戶端如由對象反對(它是一個直接對象用於客戶對象,不對象被攝體)。
如果我們從這個例子推斷,我們可以看到,方法可以表示影響對象行爲(對象不是主題)和方法參數可表示客戶對象的直接對象。
但是,方法是否應代表由對象執行的行爲尚不清楚。
所以我的問題是:我們應該如何使用方法來建模對象行爲?
1)方法應嚴格代表影響對象的行爲。 (對象不能作爲主語,只能是語法上的直接/間接/介詞賓語)
2)方法可以表示既影響對象又影響對象行爲的行爲。 (對象可能充當主語或語法上的直接/間接對象)
其中狀態(數據字段)是行爲(方法)所在的位置。 – Hippoom
這保留封裝,但我的問題是關於如何用行爲建模一個域;您的規則不考慮域名。如果我們說account.withdraw,它可能看起來像'客戶'是事實上客戶是代理人。也許最好是說account.wasWithdrawnFrom(amount)或customer.withdrawsFromOwnedAccount(amount),因爲這裏清楚的是,客戶是演員,擁有的賬戶是受影響的對象,並且金額是被執行的事情;也許customer.withdrawsFromOwnedAccount(amount)calls account.wasWithdrawnFrom(amount)? – user2852952