DTO应该使用继承还是组合

时间:2016-06-16 23:22:12

标签: java design-patterns soa composition dto

在SOA中,如果一些DTO类具有一些重复的字段。使用Composition或Inheritance是否更好,所以没有重复或只使用一个封装所有字段的DTO类。随着我的DTO类的增长,我看到很多重复的字段名称和Sonar报告是哭泣的家禽。什么是最好的方法(或替代方案)。

e.g。

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;
}

1 个答案:

答案 0 :(得分:10)

“一个DTO类”的方法几乎肯定是坏的。它闻起来像神级。许多权威人士完全谴责DTO。你可以从一些基类继承,但对于值对象,它并不是真的合理。组成相同。它使您的代码更复杂。在调试“DocReview”流程时,您必须查看两个,三个或更多DTO类,以便使用这两种方法来理解它。 Bleagh!此外,每个DTO通常位于单独的语义域中:“Doc”不是“DocReview”。因此,明显的“共同”元素实际上并不常见。他们只是共享一种实现类型;他们的意思完全不同。

当成员类型本身是复合的时,例如,如果许多域共享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”)作为后缀并不是很好的命名,真的。