Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 让不同聚合中的实体从公共类继承可以吗?_Domain Driven Design - Fatal编程技术网

Domain driven design 让不同聚合中的实体从公共类继承可以吗?

Domain driven design 让不同聚合中的实体从公共类继承可以吗?,domain-driven-design,Domain Driven Design,在属于不同聚合的几个实体中,我有一些共同的行为,我想在抽象类中考虑这些行为 让不同聚合中的实体从公共抽象类继承有什么缺点吗? 用例 一些实体具有名称、描述或其他属性,可以用不同的语言进行翻译 例如,我将使用setName(language,name)设置一个名称,并使用getName(language)检索它 每种语言的每个文本都存储在一个对象中,例如: 类EntityName { 受保护实体; 保护语言; 受保护的字符串文本; 受保护的int版本; 公共实体名称(实体、语言) { this.

在属于不同聚合的几个实体中,我有一些共同的行为,我想在抽象类中考虑这些行为

让不同聚合中的实体从公共抽象类继承有什么缺点吗?


用例 一些实体具有名称、描述或其他属性,可以用不同的语言进行翻译

例如,我将使用
setName(language,name)
设置一个名称,并使用
getName(language)
检索它

每种语言的每个文本都存储在一个对象中,例如:

类EntityName
{
受保护实体;
保护语言;
受保护的字符串文本;
受保护的int版本;
公共实体名称(实体、语言)
{
this.entity=实体;
这种语言=语言;
这个版本=1;
}
//setText(),getText()。。。
}
对于给定的
实体
类,
实体名
实体
聚合中。只有
实体
可以通过
setName()
getName()
创建、读取和写入
EntityName


但是,诸如
EntityName
EntityDescription
OtherEntityName
之类的类都将共享几乎相同的代码。除了更改之外,唯一的部分是对聚合的引用,因此也是对构造函数的引用。

关于这个主题的内容不多。然而,看看这篇题为

特别是,请阅读题为“步骤2–识别骨料和骨料根”的章节:

在高级情况下,类中存在多态性 模型也会影响聚合边界。当 多个聚合根类都共享相同的基类

如果您存储的簿记数据(id、版本、创建时间戳、更新时间戳)超出了域模型的范围(例如,为了支持您的持久性层),我不认为这是一个问题。但是,如果您试图重用真正的业务方法和属性,可以考虑用构造函数或AOP介绍替换继承。 更新

在查看更新后的用例之后,您似乎真的在尝试实现代码重用,而不是真正的关系。一些语言通过(Groovy)或(Scala)等概念更好地支持这种类型的重用。假设使用Java,您可以做的一种方法是创建一个类并使用ProjectLombok的注释转发到您的实现。这有以下好处:

  • 提供相同级别的聚合重新填充
  • 为您生成字节码,而不需要源中的所有重复
  • 允许您为真正的is-a保存一个继承选项 未来的关系
  • 确保跨域的一致性

我相信这会更纯粹,并在您的模型中实现灵活性。我在一些项目中使用了Lombok项目,并取得了巨大成功。它允许您避开Java中缺少的一些语言功能,将更多精力放在您的领域上,而不是实现某些习惯用法所需的样板代码。

我认为只要通用定义不影响聚合根设计,就可以了。也就是说,您开始对聚合根进行建模,并注意到它们有很多共同点,因此提取了一个公共基类


不过,我会三思而后行,因为来自不同有界上下文的聚合根有这么多共同点的几率有多大?这有点像代码的味道。

正确的继承是由
is-a
关系定义的。依我看,只有极少数情况适用于聚合根

根看起来相似并不意味着它们来自同一个地方


如果您可以使用在域中有意义的名称创建基类,请继续。如果没有,请不要这样做。

请随意评论以下答案。如果有不清楚或没有帮助的地方,我们可以对答案进行调整。谢谢谢谢你的回答。共享共同行为的不是聚合,而是聚合中的实体。我已经用我的用例更新了我的问题。和我提到的聚合根一样,聚合根是一个实体。谢谢你的回答。共享共同行为的不是聚合,而是聚合中的实体。我已经用我的用例更新了我的问题。@Benjamin谢谢你的澄清。我已经更新了我的答案,试图反映您的用例。我实际上使用的是PHP,它支持traits,因此这确实比使用普通抽象类更干净,谢谢!