面纱对象取代DTO

这是几天前在与Ruby Web应用程序Codexia一起工作时发现的一个新想法。 我必须从PostgreSQL获取数据行并将对象返回给客户端。 对于我来说一直是一个问题,如何在不将对象变成DTO的情况下做到这一点。 这是我找到并命名的解决方案:Veil Objects。

君士坦丁(2005年),弗朗西斯·劳伦斯(Francis Lawrence)

假设我从PostgreSQL获取项目列表:

该方法exec()@pgsql (我使用的是pgtk宝石)返回数组哈希值 ,它是这样的,如果我们把它们转换成JSON:

使fetch()方法返回一个对象数组,而不是一个哈希数组,将是很棒的。 所以我的班级Project看起来像这样:

它非常适合单项目操作:

这里有两个SQL请求不是什么大问题。 但是,如果我将哈希表的列表转换为这样的项目,则会遇到严重的性能问题:

在性能方面,这将杀死我:

此代码将生成太多冗余SQL请求。 在执行SELECT * FROM project ,我们将往返于PostgreSQL以获取几毫秒前的数据。

许多人可能建议的最简单,最显而易见的解决方案是将检索到的哈希值封装到Project对象中。 换句话说,将Project变成DTO ,即数据的持有者。 好吧,在这种情况下,我们甚至可能不需要对象,而是可以将Hash与数据一起返回。 但这不是我们希望设计面向对象软件的方式。 我们要处理对象,而不是数据结构。 而且,与此同时,我们不希望对象足够愚蠢以至于无法返回数据库以获取第二秒之前的相同数据。 这是我提出的解决方案:

这个新的Veil对象是Project的装饰器。 它的行为类似于Project ,但其中的一些方法已重新定义: name()author() 。 调用它们时,调用不会到达封装的Project 。 相反,将返回Veil存储的数据。

之所以将其称为“面纱”,是因为它的行为类似于“面纱”:仅在调用其他未设置的其他方法之前返回预设数据。 如果发生这种情况,将穿透面纱,并且Veil对象变得完全透明,从而发送所有方法调用。

因此,DTO的效率与OOP的优雅相结合。

我在yegor256 / codexia中使用了这些新的面纱对象,因此您可以看到它们的工作原理。

PS我还创建了一个Unpiercable类,该类的行为与Veil完全一样,但是永远不能被刺穿。 当您不希望与该对象发生任何修改数据的交互并且仅希望预先计算其某些方法时,此功能非常有用。

翻译自: https://www.javacodegeeks.com/2020/05/veil-objects-to-replace-dtos.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值