Java DDD:表示层和域层类的命名约定

Java DDD:表示层和域层类的命名约定,java,rest,domain-driven-design,representation,Java,Rest,Domain Driven Design,Representation,我提前道歉,因为这个问题几乎有点傻。尽管如此,我自己也不能想出一个好的解决方案,所以我认为还是值得去问 当表示对象和域对象应该具有相同的名称时,该怎么办?这并没有真正解决表示层的问题,所以我无法在那里找到帮助。Account类与其他类一样可以用来说明: package com.mycompany.myproduct.representation; public class Account { private String uuid; private String account

我提前道歉,因为这个问题几乎有点傻。尽管如此,我自己也不能想出一个好的解决方案,所以我认为还是值得去问

当表示对象和域对象应该具有相同的名称时,该怎么办?这并没有真正解决表示层的问题,所以我无法在那里找到帮助。Account类与其他类一样可以用来说明:

package com.mycompany.myproduct.representation;

public class Account {
    private String uuid;
    private String accountNumber;
    // etc

    @JsonCreator
    public Account(@JsonProperty('uuid) String ....
}
也许这个系统有一个惯例,只要可能,就以字符串的形式返回数据。但是我喜欢这里有所有的Json注释。虽然这意味着XML并没有得到真正的支持,但目前看来还可以,不过更大的灵活性会更好。然后在域层中可能会有另一个类,如下所示:

package com.mycompany.myproduct.domain.model;

import java.uti.UUID;

public class Account extends Entity {
    private UUID id;
    private BigDecimal accountNumber;
    // ... business logic, etc
}

如果这两种数据类型的名称相同,那么在它们最终必须满足的情况下,代码将很难看/不受支持。作为泛在语言的一部分,域层似乎必须具有Account类。但是外部世界谈论的是代表对象。如果这是他们的语言,为什么他们要使用不同的名称?

因为这两个类位于不同的名称空间中,所以可以使用相同的名称。但正如你所提到的,这可能会变得丑陋,而且肯定会产生误导

我强烈主张在域层中使用纯粹的“真实世界”命名。账户就是一个很好的例子。您的rich
帐户
域实体及其状态、行为和不变量表示真实世界中的帐户

域外的标识符命名对于使用它的上下文可能更为明确。例如,我通常使用以下方法:

  • AccountModel
    用于API响应模型
  • AccountTable
    用于ORM类
  • AccountDto
    用于某些传输对象(尽管请尝试避免DTO!)

每个人都有自己的标准。我认为最重要的是一致性,特别是当您与团队合作时。

由于这两个类位于不同的名称空间中,您可以使用相同的名称。但正如你所提到的,这可能会变得丑陋,而且肯定会产生误导

我强烈主张在域层中使用纯粹的“真实世界”命名。账户就是一个很好的例子。您的rich
帐户
域实体及其状态、行为和不变量表示真实世界中的帐户

域外的标识符命名对于使用它的上下文可能更为明确。例如,我通常使用以下方法:

  • AccountModel
    用于API响应模型
  • AccountTable
    用于ORM类
  • AccountDto
    用于某些传输对象(尽管请尝试避免DTO!)

每个人都有自己的标准。我认为最重要的是一致性,尤其是在与团队合作时。

您确定DDD中有“表示”层吗?我认为只有接口、应用程序、域和基础结构层(当遵循分层体系结构时)。无论如何,在你的例子中,我认为在域层中只有一个
Account
类,这个类可以很好地包含JSON注释。我不是想暗示在DDD中正式存在这样一个层——这就是我所说的在我包含的DDD示例链接中没有这样一个层。但这并不意味着REST表示层不能与DDD一起使用。我问的是人们在这种情况下所做的事情。我考虑元数据注释,如<代码> @ JSONCRECTORION/CODE >或JPA的持久性注释,如<代码> @ ID>代码>、<代码> @ Time<代码>等,适用于域层中的实体。因此,我将使用相同的类。您使用的是DTO(数据传输对象),这是一个不错的选择。我倾向于不公开持久层对象。我在DTO中看到的一种常见模式是简单地将
DTO
附加到类名中。我甚至看到人们使用
表示法
。就我个人而言,我通常不使用相同的名字。这让人困惑你确定DDD中有“表示”层吗?我认为只有接口、应用程序、域和基础结构层(当遵循分层体系结构时)。无论如何,在你的例子中,我认为在域层中只有一个
Account
类,这个类可以很好地包含JSON注释。我不是想暗示在DDD中正式存在这样一个层——这就是我所说的在我包含的DDD示例链接中没有这样一个层。但这并不意味着REST表示层不能与DDD一起使用。我问的是人们在这种情况下所做的事情。我考虑元数据注释,如<代码> @ JSONCRECTORION/CODE >或JPA的持久性注释,如<代码> @ ID>代码>、<代码> @ Time<代码>等,适用于域层中的实体。因此,我将使用相同的类。您使用的是DTO(数据传输对象),这是一个不错的选择。我倾向于不公开持久层对象。我在DTO中看到的一种常见模式是简单地将
DTO
附加到类名中。我甚至看到人们使用
表示法
。就我个人而言,我通常不使用相同的名字。这让人困惑