Java DTO应该使用继承还是组合

Java DTO应该使用继承还是组合,java,design-patterns,soa,composition,dto,Java,Design Patterns,Soa,Composition,Dto,在SOA中,如果几个DTO类有一些字段在多个域中重复出现。使用组合或继承这样就不会重复,还是只使用一个DTO类封装所有字段更好。随着我的DTO类的增长,我看到很多重复的字段名,Sonar report正在大喊大叫。最佳方法(或替代方法)是什么 e、 g “一个DTO类”的方法几乎肯定是不好的。闻起来像上帝的课堂。许多专家对DTO进行了严厉的批评。您可以从一些基类继承,但对于值对象来说,这并不是很明智。构图也一样。这会使代码更加复杂。在调试“DocReview”流时,您必须查看两个、三个或更多的D

在SOA中,如果几个DTO类有一些字段在多个域中重复出现。使用组合或继承这样就不会重复,还是只使用一个DTO类封装所有字段更好。随着我的DTO类的增长,我看到很多重复的字段名,Sonar report正在大喊大叫。最佳方法(或替代方法)是什么

e、 g

“一个DTO类”的方法几乎肯定是不好的。闻起来像上帝的课堂。许多专家对DTO进行了严厉的批评。您可以从一些基类继承,但对于值对象来说,这并不是很明智。构图也一样。这会使代码更加复杂。在调试“DocReview”流时,您必须查看两个、三个或更多的DTO类,才能理解其中任何一种方法。萧瑟!此外,每个DTO通常位于单独的语义域中:“Doc”不是“DocReview”。因此,表面上的“共同”元素实际上根本不是共同的。它们只是共享一种实现类型;它们的意思完全不同

当成员类型本质上是复合的时,例如,如果许多域共享
标识符的概念,则可以将该类型作为这些域的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”)作为后缀是不好的命名,真的。

如果一个Dto与另一个Dto有“is a”关系,那么它应该使用继承吗?如果一个DTO与另一个DTO有“has a”关系,那么它应该使用组合吗?这些才是你真正想问的问题。继承或创作本身并不是目的。卢所说的。。。一般来说,避免继承,喜欢组合。对于多态性(Car->ferari->modelxxx)来说,继承是一个很好的实践,它将公共字段提取到一个类中并使用组合是有意义的。我同意命名约定xxxDto很尴尬,但我们有实体命名为例如Doc,所以需要一些方法来区分。你说——许多专家都谴责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;
}