bfs expedia_Expedia如何摆脱Java Bean变压器

bfs expedia

重要要点

  • 为创新投入一些工作时间可能会鼓励开发人员表达自己的潜力,创建对日常活动有用的解决方案
  • 使开放源代码,解决常见问题的产品或解决方案可以帮助其他人
  • 激情是优质软件的关键要素
  • BULL可有效加快开发阶段,同时减少引入错误的可能性
  • 在实际情况下,BULL不会导致任何性能下降

在分层体系结构中,通过封装对特定数据对象的更改并将这些更改传播到其他层来创建抽象级别, 对象映射过程可能变得强制且麻烦。

传统上,数据对象映射是通过手动编码转换器解决的,该转换器在实体(或Java Bean)之间复制数据。

根据您需要转换的项目数,此任务可能需要数以千计的时间,并且需要成千上万的代码行映射到其不同的数据对象以及从其不同的数据对象映射。

所需的工作量很大,尤其是在考虑了必要的测试用例数量的情况下。

用于此类转换的这种类型的代码相当无聊,并且极易出错,所以为什么不自动执行呢?

问题

幸运的是,网络上有很多映射框架可以为我们做到这一点,所以我们很安全!

但是,如果您的Java Bean按照通用的安全最佳实践是不可变的,会发生什么? 其结果是,没有可用的映射框架能够以简单的方式转换对象。

解决方案

一个可以自动转换各种Java Bean(包括不可变,可变和混合)的库将为我们节省很多工作,而BULL可以。

好处

为了更好地展示使用该库的好处,让我们看一个例子:假设您正在开发一个多层应用程序,其构建如下:

FooController包含一个Rest API,该API在输入中获取请求并在执行了一组操作后返回响应。

为了获得响应, FooController需要获取请求/响应数据(由Domain对象映射,类似于 )跨越三层运动,所以我们确实需要落实,为他们每个人:一个变压器 (加上其测试),该副本,如果需要修改,从一个对象下一层的数据到另一个。

总结一下,对于每一层,我们将需要20个类,划分如下:

  • 1服务等级
  • 1服务等级测试
  • 6个领域对象
  • 6个变形金刚
  • 6变压器测试

3层相乘得出总共60个类。

现在让我们使用BULL分析相同的场景:

现在情况看起来已经大不相同了:不再需要Transformer类,而我们所有3层所需的总类减少到只有24个,总的来说,我们的代码少了60%。 这意味着:

  • 更少的开发时间(因此直接降低了成本)
  • 减少引入错误的可能性
  • 易于维护的代码

公牛能做什么

BULL的构建旨在使它的使用尽可能容易,实际上,要转换一个对象,只需一行代码即可:

ToBean toBean = new BeanUtils().transform(fromBean, ToBean.class);

根据今天的情况,可用的一些功能包括:

  • 支持不可变bean的副本。
  • 支持可变豆的副本。
  • 支持混合bean的副本(某些字段是私有字段,有些不是)。
  • 支持没有getter和setter的Java bean副本。
  • 支持 通过注释进行验证
  • 支持使用Java基本类型进行复制
  • 支持使用Java Collection类型进行复制
  • 支持带有嵌套地图字段的复制
  • 支持包含原始类型而不是对象类型的Array的复制
  • 支持带有属性名称映射的副本
  • 支持带有递归副本的副本
  • 支持lambda函数字段转换

提供了功能的完整列表,其中包括示例,总是不断更新 在这里

现实生活中的转变

我们知道,在现实生活中,很少需要在几乎相同的两个Java Bean之间复制信息,这种情况经常发生:

  • 目标对象与源对象的结构完全不同
  • 我们需要在复制特定字段值之前对其执行一些操作
  • 必须验证目标对象的字段
  • 目标对象比源对象有一个额外的字段,需要填充来自其他源的内容

我们该如何解决呢? BULL使您可以在特定字段上执行任何类型的操作!

利用lambda表达式 ,开发人员可以定义自己的方法,该方法将在复制值之前应用于a值。

让我们用一个例子更好地解释一下:

给定以下Source类:

public class FromFoo {
  private final String id;
  private final String val;
  private final List<FromSubFoo> nestedObjectList;
  
  // all args constructor   
  // getters
}

和以下Destination类:

public class MixedToFoo {
  public String id;
 
  @NotNull
  private final Double val;
  
  // constructors
  // getters and setters
}

并假设 在我们的变压器中, val字段需要乘以一个随机值,我们有两个问题:

  1. val字段的类型与Source对象的类型不同,实际上一个是String,另一个是Double
  2. 我们需要指导图书馆如何应用数学运算

好吧,这非常简单,您只需要定义自己的Lambda表达式即可:

FieldTransformer<String, Double> valTransformer =
     new FieldTransformer<>("val",
                      n -> Double.valueOf(n) * Math.random());

该表达式将应用于目标对象中名称为“ val 的字段。

最后一步是将BULL实例传递给函数:

beanUtils.getTransformer()
      .withFieldTransformer(valTransformer)
      .transform(fromFoo, MixedToFoo.class);

对于“字段验证”方面而言,它甚至更简单,因为您只需要使用现有的一个注释字段即可 javax.validation.constraints (或定义一个自定义的)就可以了。

我们如何到达那里?

当我们过去经常实现大量的Java Bean Transformers时,比我们正在研究的核心功能需要更多的实现时间,因此,我们决定开始实施一些可以加快开发过程并且对所有开发人员都有用的东西。那些正在处理同一问题的人。

由于使用Hotels.com公司的企业文化,我们每周有半天时间用于创新项目。 借此机会来实现此功能以及其他产品,现在正显示出其好处。 在这种情况下,我们显着减少了我们开发的多个功能的开发时间。

为什么选择开放采购

  1. OSS也具有长期生存能力。 它由组织和个人开发人员组成的全球社区创建和支持,其中许多人还遵循协作和志愿服务等开源价值观。
  2. OSS得到开发人员社区的支持。 这些相同的开发机构正在不断审查其支持的OSS代码,全球范围内从事该项目的数千名独立开发人员也是如此。 结果是庞大的同行评审过程,可确保安全性和问责制。
  3. OSS具有强大的价值-OSS商店和开发人员通常具有相似的价值-他们倡导更多的社区参与,协作和志愿服务。 他们坚信共同开发免费,优质的产品,营利性组织和非营利性组织都可以使用。
    这种信念强调了最好的OSS商店和开发商的使命。 它推动他们构建新功能并将这些功能回馈给社区。 直接的结果是,流行的OSS项目通常处于技术的最前沿。

有用的链接

结论和要点

  1. 为创新投入一些工作时间可能会鼓励开发人员表达自己的潜力,创建对日常活动有用的解决方案。 该库是一个很好的例子,因为它已经在那些时间里实现了,现在它使Expedia节省了时间和金钱。
  2. Make Open Source(一种解决常见问题的产品或解决方案)可能会帮助其他肯定会赞赏的人,并且可能会鼓励他们合作进行改进,从而使软件始终更好
  3. 激情是好的软件的基本要素,因为在大多数情况下,这将花费很多时间,但最终会补偿所做的努力
  4. BULL可有效加快开发阶段(在与上述情况类似的情况下),同时减少了引入错误的可能性
  5. 在实际情况下,BULL不会导致任何性能下降

翻译自: https://www.infoq.com/articles/expedia-rid-of-bean-transformers/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

bfs expedia

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值