nto*_*end 125 java ejb anti-patterns data-transfer-objects dto
我最近听到人们说数据传输对象(DTO)是一种反模式.
为什么?有哪些替代方案?
KLE*_*KLE 130
有些项目有两次所有数据.一旦作为域对象,一次作为数据传输对象.
这种复制具有巨大的成本,因此架构需要从这种分离中获得巨大的好处才值得.
Gab*_*art 123
DTO不是反模式.当您通过网络发送一些数据(例如,通过Ajax调用中的网页)时,您希望通过仅发送目标将使用的数据来确保节省带宽.此外,表示层通常方便地使数据具有与本机业务对象略微不同的格式.
我知道这是一个面向Java的问题,但在.NET语言中,匿名类型,序列化和LINQ允许即时构建DTO,这减少了使用它们的设置和开销.
aem*_*aem 24
EJB 3.0之前EJB规范中Entity Beans的重量级特性导致使用数据传输对象(DTO)等设计模式.DTO成为轻量级对象(它本身应该是实体bean本身),用于跨层发送数据......现在EJB 3.0规范使Entity bean模型与Plain old Java对象(POJO)相同.使用这个新的POJO模型,您将不再需要为每个实体或一组实体创建DTO ...如果要跨层发送EJB 3.0实体,则只需实现java.io.Serialiazable
Jon*_*Jon 19
我不认为DTO本身就是一种反模式,但是有一些与使用DTO相关的反模式.Bill Dudney以DTO爆炸为例:
http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf
此处提到的DTO也有一些滥用:
http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/
它们起源于三层系统(通常使用EJB作为技术)作为在层之间传递数据的手段.大多数基于Spring等框架的现代Java系统在单层中使用POJO作为域对象(通常用JPA等注释......)来替代简化视图......这里使用DTO是不必要的.
如果您正在构建分布式系统,那么DTO肯定不是反模式.不是每个人都会在这个意义上发展,但如果你有一个(例如)Open Social应用程序都运行JavaScript.
它会将大量数据发布到您的API.然后将其反序列化为某种形式的对象,通常是DTO/Request对象.然后可以对其进行验证,以确保在转换为模型对象之前输入的数据是正确的.
在我看来,它被视为一种反模式,因为它被误用了.如果您不构建分布式系统,则可能不需要它们.
当您让所有域对象都急切地加载关联对象时,DTO 成为必需品而不是反模式。
如果您不制作 DTO,您将有不必要的对象从您的业务层传输到您的客户端/Web 层。
为了限制这种情况的开销,不如转移 DTO。
问题不应该是“为什么”,而是“何时”。
当使用它的唯一结果是更高的成本- 运行时间或维护时,它绝对是反模式。我从事过与数据库实体类相同的具有数百个 DTO 的项目。每次你想添加一个字段时,你都会添加四次 id - 到 DTO,到实体,从 DTO 到域类或实体的转换,逆转换,......你忘记了一些地方和数据不一致。
当您确实需要域类的不同表示时,这不是反模式- 更扁平,更丰富,更窄,......
我个人从域类开始并传递它,并在正确的位置进行适当的检查。我可以注释和/或添加一些“帮助器”类来制作映射、数据库、序列化格式(如 JSON 或 XML)……如果我觉得需要,我总是可以将一个类拆分为两个。
这是关于您的观点 - 我更喜欢将域对象视为扮演各种角色的单个对象,而不是相互创建的多个对象。如果对象的唯一作用是传输数据,那么它就是 DTO。
归档时间: |
|
查看次数: |
50451 次 |
最近记录: |