Domain driven design 对DDD的一些概念感到困惑

Domain driven design 对DDD的一些概念感到困惑,domain-driven-design,value-objects,Domain Driven Design,Value Objects,我对一些DDD概念有一些疑问: 在Evans关于DDD的书中,在VALUE OBJECTS一节中,他说要将组成概念整体的属性放在VALUE Object中,就像他的Address OBJECTS示例中一样。我似乎看不出这比将属性留在客户实体中更有好处。通过将其移出客户,使其成为价值对象,然后在客户中引用价值对象,我将获得什么?请举出一些实际例子 规范也可以用于值对象吗 实体对象的所有属性是否为其他实体对象和/或值对象?或者它们可以有原语吗 浏览internet时,我看到一些人说setter(和g

我对一些DDD概念有一些疑问:

  • 在Evans关于DDD的书中,在VALUE OBJECTS一节中,他说要将组成概念整体的属性放在VALUE Object中,就像他的Address OBJECTS示例中一样。我似乎看不出这比将属性留在客户实体中更有好处。通过将其移出客户,使其成为价值对象,然后在客户中引用价值对象,我将获得什么?请举出一些实际例子

  • 规范也可以用于值对象吗

  • 实体对象的所有属性是否为其他实体对象和/或值对象?或者它们可以有原语吗

  • 浏览internet时,我看到一些人说setter(和getter?)是邪恶的,应该避免它们,并用对域对象有意义的操作替换它们

  • 例如:

    Account.Balance = 100;  // set via property setter
    
    应该是:

    Account.DebitToAccount(100); // this would change the balance
    
    在本例中,我可以理解它们的含义,但对于一些常见属性,如FirstName、MiddleName、LastName,又如何呢?我认为,为每个属性设置方法(比如ChangeName())只是为了设置它们,这既单调又毫无意义。假设我们选择了ChangeName()这样的方法,那么对于没有其他groupable属性的属性呢?比如说标题?我们也应该有一个ChangeTitle()吗?(标题只是一个例子,请不要说我可以将标题分组到其他一些属性)

  • 域概念的封装。地址不是任何字符串,价格不是任何数字/小数。VO表示表示为对象的域概念的有效值。请注意,“a”值实际上并不意味着封装1原语。你可以举一个例子来说明我是如何为一些值对象建模的

  • 没有

  • 这不是规则。实体属性的类型应更合理。一些表示域概念,另一些表示更一般的概念(如电子邮件),另一些只是基本概念

  • 不是真正的DDD,这是正确的OOP。关键是要封装行为。设置属性只是一个简单的赋值。DebitToAccount是对象的一种语义行为,只能作为属性赋值来实现。事情很容易改变,您只希望该对象了解这些实现细节。行为本身保持不变,实现可以随时更改(例如:需要新的业务规则)

  • 至少在C#中,您实际上不需要ChangeName(),您可以将实现放在setter中。在这个场景中没有规则,甚至没有原则,这取决于开发人员的风格