2014-05-11 76 views
1

我有一些DDD概念的一些問題:困惑於一些DDD概念

  1. 在埃文斯的書約DDD,在部分值對象,他說把屬性,使一個概念上的整體值對象就像他在Address對象中的例子。我似乎看不到將這些屬性留在客戶實體中的好處。通過將其移出客戶,使其成爲價值對象,然後在客戶中引用VALUE OBJECT,我可以獲得什麼?請舉一些實際的例子。

  2. 規格是否也可用於數值對象?

  3. 是否所有屬性的實體對象或其他實體對象和/或值對象?或者他們可以有原始?

  4. 瀏覽互聯網,我看到有人說setter(和getters?)是邪惡的,他們應該避免並替換爲對域對象有意義的操作。

例如:

Account.Balance = 100; // set via property setter 

應該是:

Account.DebitToAccount(100); // this would change the balance 

在這個例子中,我能理解他們所暗示,但關於像名字,中間名的一些常見的性質是什麼,姓?我認爲爲每個屬性設置方法(比如ChangeName())是乏味和毫無意義的。假設我們選擇了像ChangeName()這樣的方法,那麼對於沒有其他可分組屬性的屬性呢?例如,說標題?我們是否也應該有ChangeTitle()? (標題只是一個例子,請不要說我可以將標題分組到某個其他屬性)

回答

1
  1. 封裝域概念。一個地址不只是任何字符串,一個價格不是任何數/小數。 VO表示作爲對象表達的域概念的有效值。請注意,'a'值並不意味着封裝1個基元。你可以用see here這個例子來描述我對一些價值對象的建模。

  2. 這不是一個規則。實體的屬性應該是更有意義的類型。一些代表領域概念,其他代表更一般的概念(如電子郵件),而其他則僅代表基本概念。

  3. 不是真的DDD,這是適當的OOP。關鍵是你想封裝行爲。設置一個屬性只是一個簡單的任務。 DebitToAccount是可以僅作爲屬性分配來實現的對象的語義行爲。事情可以很容易地改變,你只需要那個對象知道那些實現細節。行爲本身保持不變,實現可隨時更改(例如:需要新的業務規則)。

至少在C#中你並不需要ChangeName(),你可以把這個實現放在setter中。沒有規則,在這種情況下甚至沒有原則,這取決於開發者的風格。