为什么数据传输对象(DTO)是反模式?

155
我最近听到人们说数据传输对象(DTO)是一种反模式。

为什么?有什么替代方案吗?


14
可能是因为业务对象本身能够传输它们自己的数据,非常感谢! - Zoidberg
18
"反模式"可能是我提名的"15分钟已经过去的短语"。现在,它的意思相当于"我不想费心证明我的想法",就像"众所周知..."一样。 - Craig Stuntz
7
送方法过程中传递对象给我们带来了CORBA、DCOM等经验,我尝试忘掉它们。但问题是,迟早会有人想要调用那些方法。 - Craig Stuntz
15
DTO代表DRY原则,不幸的是在J2EE中它意味着“做重复的事情”。 - joeforker
2
你可能想阅读这篇文章: 数据传输对象是耻辱 - yegor256
11个回答

2

数据传输对象的意图是从不同的源存储数据,然后一次性将其传输到数据库(或远程门面)中。

但是,DTO模式违反了单一职责原则,因为DTO不仅存储数据,还将其从数据库/门面传输进出。

将数据对象与业务对象分离的需求并非反模式,因为很可能需要分离数据库层

应该使用聚合和仓储模式来替代DTO,这将分离对象的集合(聚合)和数据传输(仓储)。

要传输一组对象,您可以使用工作单元模式,该模式包含一组存储库和事务上下文;以便在事务内分别传输聚合中的每个对象。

1
DTO不仅存储数据,还可以从数据库/门面传输数据。根据SRP原则,您如何提议在不存储任何表示形式的情况下传输数据?我猜您会告诉我一个具有两个字段的类违反了SRP,因为它存储了两个东西,而不是单个东西? - dan carter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接