2013-10-07 28 views
1

在域驅動設計中,強調將行爲置於正確的位置。雖然我並不總是確定究竟是什麼構成「正確的」。當一個域對象被執行時,你如何表示域對象的行爲,而不是actor?

請考慮這種情況:「客戶從銀行賬戶中提取一定數額的資金。」

在語法上,我們有:

  • '客戶' 是主題

  • '退出' 是一個動詞

  • '量' 是直接對象

  • '帳戶' 是一個影響介詞對象

傳統上,客戶端將執行這樣的:account.withdraw(量)

這可以被理解爲:「客戶命令一個銀行賬戶提取一筆錢。」然而,這在語法上並不符合原始情況,因爲'銀行賬戶'現在是直接對象不定式從主要條款中刪除'撤回'和'金額',因此傳達的主要想法是'客戶命令帳戶'。

要堅持DDD,我們應該把這段代碼當作精確描述原始場景。這意味着'提款'方法不會模擬賬戶(該賬戶不是主題)執行的行爲,而是它模擬的行爲是它間接影響它(該賬戶是一個介詞對象),很可能會重命名爲'wasWithdrawnFrom'。此外,該方法自變量表示的東西受着由客戶端如由對象反對(它是一個直接對象用於客戶對象,不對象被攝體)。

如果我們從這個例子推斷,我們可以看到,方法可以表示影響對象行爲(對象不是主題)和方法參數可表示客戶對象的直接對象。

但是,方法是否應代表由對象執行的行爲尚不清楚。

所以我的問題是:我們應該如何使用方法來建模對象行爲?

1)方法應嚴格代表影響對象的行爲。 (對象不能作爲主語,只能是語法上的直接/間接/介詞賓語)

2)方法可以表示既影響對象又影響對象行爲的行爲。 (對象可能充當主語或語法上的直接/間接對象)

+0

其中狀態(數據字段)是行爲(方法)所在的位置。 – Hippoom

+0

這保留封裝,但我的問題是關於如何用行爲建模一個域;您的規則不考慮域名。如果我們說account.withdraw,它可能看起來像'客戶'是事實上客戶是代理人。也許最好是說account.wasWithdrawnFrom(amount)或customer.withdrawsFromOwnedAccount(amount),因爲這裏清楚的是,客戶是演員,擁有的賬戶是受影響的對象,並且金額是被執行的事情;也許customer.withdrawsFromOwnedAccount(amount)calls account.wasWithdrawnFrom(amount)? – user2852952

回答

0

你似乎被困在理論論文中。我不確定你可以應用適用於每個場景/項目的理論。行爲通常在您開始使用用例轟炸模型時出現。我試圖讓案件指控行爲。 要按照您的示例:

演員客戶想要從帳戶中提款。這樣做的方式就像你Account.Withdraw(金額)

但你的問題「我們應該如何使用方法來建模對象的行爲?」是一個常見的DDD問題。如何用行爲豐富你的模型?我最好的提示是找到你的價值對象。價值對象通常具有行爲。

在示例帳戶和實體(可能聚集根)。貨幣(包含貨幣和金額的價值對象)應從賬戶中提取。這應該是帳戶單一負責人(原則)來控制帳戶餘額及其所有訪問權限。 關於你最後的(2)問題。方法絕對用於改變對象的內部狀態。但是當涉及實體/值對象(如 Customer.Order(newOrder)或advert.Apply(candidateCV))所執行的行爲時,我們可以使實體相互通信。我們還可以通過域事件創建鏈式行爲,這可以幫助我們不會將太多的業務邏輯泄露給我們的應用程序服務。請參閱Udi Dahan的博客或我的博客文章有關貧血域模型http://magnusbackeus.wordpress.com/2011/05/31/preventing-anemic-domain-model-where-is-my-model-behaviour/

我希望你有一些想法。當我們在這裏抽象時,很難給出具體的提示。 /致敬Magnus

0

我覺得這個場景太簡單了,不是真實的,因此太簡單了。我將重新編制「客戶從銀行賬戶中提取一定數額的金錢」。

喜歡的東西

「的客戶端提交值XXX $的提款申請從他的賬戶」(當我去我的銀行我必須填寫表格,以取錢,我聲明量,帳戶號碼,日期和我的簽名)

有一個可以當場的請求(命令)到客戶機的服務(撤出服務)(客戶識別通過從他的賬戶ID)(帳戶ID)和貨幣價值(貨幣作爲價值對象)。

+0

我明白你的意思了,但我認爲我的例子中的問題不是它的過於簡單,問題在於它可能無法準確描述銀行領域的實際情況(銀行出納員處理提款請求,而不是提款)。然而,我們可以假裝我的例子實際上是域問題(ATM機可能?)或者用一個更現實的替代它(「客戶端刪除一個訂單」=> order.delete),問題將會保留。我的問題的關鍵不是要問一個銀行領域的問題,而是一個更一般的DDD問題。 – user2852952

0

我不太關心語法,因爲英語是我的第二語言,所以當試圖理解域時,我試圖理解業務如何看待概念(賬戶)和工作流(提取金額),而不是做語法分析。

DDD的意義在於對事物進行建模,因此行爲根據域的理解顯示出來。

在這種情況下,對我來說很明顯,我們正在帳戶操作有界上下文中工作,並且至少涉及帳戶聚合根。當然,從銀行的角度來看,可能(我在這裏猜測)不會出現撤銷,而是增加賬戶的借/貸部分的操作,所以很可能賬戶將記錄發生了借/貸操作。並且域名事件誕生併發布。然後讓領域專家告訴你接下來會發生什麼。

「客戶機刪除命令」 => order.delete

大概的順序不會被刪除,但其狀態會改變爲「取消」或類似。然而,在這種情況下,如果真的應該刪除訂單,訂單不會自行刪除,訂單存儲庫會刪除該訂單。

+0

我同意使用英文是任意的,但DDD規定模型必須很好地表達域情景,如果我的域專家說英語,模型應表達連貫的英語情景。在您的評論中,您嘗試修改我的銀行業務和訂購場景,我同意您的觀點可能不正確;但我的問題的關鍵不在於情景是否正確,而是假設它是**,如何模擬撤回行爲。這樣如何:「用戶在訓練期間記錄練習量。」我們是否說trainingSession.recordExercise(金額)? – user2852952

+0

您不會從語法分析中獲得行爲,您可以從理解業務環境中的詞語意味着什麼。我不認爲你可以從能夠給你正確行爲的單詞中提取一個公式。關於練習的例子,我從來沒有聽過有人這樣說過。也許用戶在培訓課程中註冊她的進度。但是,再次,我必須知道該域名是如何工作的,以及利益相關者對該應用的要求。 – MikeSW

相關問題