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")作为后缀并不是很好的命名方式,真的。
在 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")作为后缀并不是很好的命名方式,真的。