Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们应该有类似的DTO吗?_Java_Oop_Dto_Code Duplication - Fatal编程技术网

Java 我们应该有类似的DTO吗?

Java 我们应该有类似的DTO吗?,java,oop,dto,code-duplication,Java,Oop,Dto,Code Duplication,我有两个不同使用的DTO,但它们有相似的字段。例如,myidsdto使用MyIdDto中的信息。后一个对象是用数据库中的数据构建的,而myidsdo是用ElasticSearch构建的,并用MyIdDto数据完成 在我看来,应该只有1个DTO,并且代码在DTO中设置了它想要的尽可能多的字段。其他人说MyIDSDTO应该扩展MyIdDto。其他人同意这种实现,说如果删除某些功能,它不会破坏代码。哪一个更好用?你能告诉我你选择的理由吗 @Data @NoArgsConstructor

我有两个不同使用的DTO,但它们有相似的字段。例如,
myidsdto
使用
MyIdDto
中的信息。后一个对象是用数据库中的数据构建的,而
myidsdo
是用ElasticSearch构建的,并用
MyIdDto
数据完成

在我看来,应该只有1个DTO,并且代码在DTO中设置了它想要的尽可能多的字段。其他人说MyIDSDTO应该扩展MyIdDto。其他人同意这种实现,说如果删除某些功能,它不会破坏代码。哪一个更好用?你能告诉我你选择的理由吗

    @Data
    @NoArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class MyIdESDto {
      private String name;
      private Integer id;
      private Integer age;


     public MyIdESDto(MyDto dto) {
        this.name = dto.getName();
        this.id = dto.getId();
        this.aage = 42;
     }
}




@Data
    @NoArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class MyIdDto {
      private String name;
      private Integer id;
   }

我会支持当前的实现,因为第三组给出了相同的理由


对我来说,继承不是一个好主意,因为我在这里看不到
is-a
关系;它们几乎没有相似的,而且有些相关的属性。

继承是表达a is-a B的一种手段。这并不是为了防止代码重复

因此,如果你能找到一个有意义的解释,为什么MyIdDto也是一个MyIdDto,那么继承就是自然的选择。如果没有,那么就选择两个不同的类

另一方面,有时实用主义也能提供很好的指导。因此,如果您的团队中的大多数人认为继承解决方案“更好”,那么就这样做吧


换句话说:这确实是一个“风格”问题。这两个方向都没有“更好”,也没有确凿的事实。因此:选择最适合代码负责人的解决方案。分别针对受此决策影响最大的人员(这两个组并不总是相同的)。

DTO只是一组属性(即没有业务逻辑)。因此,通过引入DTO层次结构可以避免的唯一重复是setter和getter的重复,这可能会导致几行代码,但其本身并不复杂

如果每个DTO建模一个不同的概念,并且这两个类都不打算在相关代码中使用(在这些代码中,可以从一些OO抽象中受益),那么代码设置中的字段数量将使您很难随时了解哪些字段已初始化。(例如,很明显,
MyIdDto
没有
age
,但如果我们将
MyIdESDto
age=0
一起使用,我们必须追踪DTO来自何处,以便知道我们是否可以信任
MyIdESDto.age
的值)

当面对这个问题时,我通常会想到以下方式(我同意,这可能有点争议):

在某些情况下,复制代码可以保留软件架构 干净易懂。副本也可用于保存 无法阅读、复杂的抽象内容,无法进入系统(…) 抽象为处理两个或多个相似但独立的代码 不断变化的需求可能很难修改