3

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

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

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

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

你对此有什么看法?谢谢你。

4

2 回答 2

0

添加专用字段没有继承。

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

  • 额外数据是一种常见现象,因此只要不得重写方法以使用该额外数据,您实际上就是在解耦数据。您是说这个额外的字段不是那些其他字段的计算的一部分

  • 仅出于完整性考虑:在极少数情况下,可以将这样的额外字段设置为超类的瞬态字段。

于 2018-02-22T11:09:52.230 回答
0

如果您使用的是 Hibernate 架构,我会为那些只需要 UI 的注释使用 @Transient 注释,因为带有注释的 DTO 属性不会被解析到 DB 端。

例如

@Transient
private String type; //data used in UI only
于 2018-02-22T09:56:46.517 回答