DTO应该使用继承还是组合

Should DTOs use inheritance or composition

在 SOA 中,如果一些 DTO classes 有一些重复的字段。使用组合还是继承更好,这样就没有重复,或者只使用一个 DTO class 封装所有 fields.As 我的 DTO classes 增长我看到很多重复的字段名称和声纳报告正在哭泣的家禽。什么是最好的方法(或替代方法)。

例如

public class DocDto{
    private Long id;
    private String name;
    private String docType
}

public class DocReviewDto{
    private Long id;
    private String name;
    private String status;
    private String comment;
}

"one DTO class" 方法几乎肯定是不好的。闻起来像上帝Class。许多权威人士完全谴责 DTO。您可以从某些基础 class 继承,但对于值对象来说,这并不是很明智。作文也一样。它使您的代码更加复杂。在调试 "DocReview" 流程时,您必须查看两个、三个或更多 DTO classes 才能使用任何一种方法来理解它。惨叫!此外,每个 DTO 通常都在一个单独的语义域中:"Doc" 不是 "DocReview"。所以明显的 "common" 元素实际上根本不常见。他们只是共享一个实现类型;它们的含义完全不同。

当成员类型本质上是复合的时,例如,如果许多域共享 Identifier 的概念,您可以将其作为组合到这些域的 DTO 中的类型。在您的示例中,您可能有

public class Identifier {
  long id; // should be a 'String', actually
  String name;
}

public class Doc {
  private Identifier identifier;
  private String docType
}

public class DocReview {
  private Identifier identifier;
  private String status;
  private String comment;
}

这里的关键是 Identifier 在两个域中在语义上是等价的,因此将其作为通用类型是有意义的。否则你不会那样做。

补充说明:"Dto"(或"DTO")作为后缀并不是很好的命名方式,真的。