DTO可以延长另一个DTO吗?

时间:2012-07-04 14:32:31

标签: java dto

这更像是一个理论问题,而不是一个实际问题。

我们有一个分层架构,有点像:

UI <--DTO1--> UI_JavaHandler <--DTO2--> Backend

DTO1需要比DTO2多一点数据,而且需要额外的字符串。所以问题是,DTO1应该扩展DTO2还是应该封装DTO2?在第一种情况下,UI_JavaHandler中的代码将是:

public void acceptAction(DTO1 dto1) {
    //do something with dto1.getString();
    backend.call(dto1);
}

而在第二种情况下:

public void acceptAction(DTO1 dto1) {
    //do something with dto1.getString();
    backend.call(dto1.getDto2());
}

扩展Java DTO2工作正常,但我不喜欢仅使用扩展来添加新数据的想法。我习惯使用扩展来添加新的行为(比如Dog和Cat扩展的Animal)。由于聚合可以使用相同的效果,我们不应该使用扩展,但是我没有强烈反对这种(ab)使用(?)的论据。

另一方面,我可能完全错了。

你对此有何看法?谢谢。

2 个答案:

答案 0 :(得分:0)

没有用于添加专用字段的继承。

  • 后端数据模型明确分开,显式使用扩展类。这也防止了具有DTO1Handler extends DTO2Handler的反模式和超类的其他不适当的用法。链式不可空的吸气剂是可以接受的。

  • 额外数据是一种常见现象,因此只要不使用方法来覆盖这些额外数据,您实际上就是解耦数据。您说此额外字段不是其他字段的计算的一部分

  • 为了完整起见:在极少数情况下,这样的额外字段可以成为超类的瞬态字段。

答案 1 :(得分:-1)

如果您正在使用Hibernate架构,我会将@Transient注释用于UI所需的注释,因为带有注释的DTO属性不会被解析为DB端。

e.g。

@Transient
private String type; //data used in UI only