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

DDD: naming convention for Representation Layer and Domain Layer classes

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

当 Representation 对象和 Domain 对象应该同名时,该怎么办? DDD Sample 并没有真正解决表示层,所以我无法在那里找到帮助。一个帐户 class 与任何帐户一样有效,以说明:

package com.mycompany.myproduct.representation;

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

    @JsonCreator
    public Account(@JsonProperty('uuid) String ....
}

也许这个系统有一个约定,只要有可能,return 数据就是字符串。但我喜欢这里有所有 Json 注释。虽然这意味着 XML 不受真正支持,但目前看来还可以,但如果有更大的灵活性会更好。然后在 Domain 层中可能还有另一个 class 像这样:

package com.mycompany.myproduct.domain.model;

import java.uti.UUID;

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

如果这两种数据类型的名称相同,那么在它们最终必须相遇的情况下,代码将是 ugly/unsupportable。作为通用语言的一部分,域层似乎必须拥有帐户 Class。但是外界是用表象对象来说话的。如果那是他们的语言,他们为什么要使用不同的语言?

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

我强烈主张在您的域层中使用纯 "real-world" 命名。帐户就是一个很好的例子。您丰富的 Account 域实体及其状态、行为和不变量代表现实世界中的一个帐户。

域外的标识符命名对于使用它的上下文可能应该更明确。比如我一般使用如下:

  • AccountModel 用于 API 响应模型。
  • AccountTable 对于 ORM class.
  • AccountDto 对于某些传输对象(尽管请尽量避免 DTO!)

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