设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

腾讯工作近十年大佬:不是我打击你!你可能真的不会写Java(3)

发布时间:2019-07-01 16:18 所属栏目:21 来源:程序员小姐
导读:不知道在看完这段代码之后,读者有是否发现还有其他问题的存在,作为一个优秀的 Java 程序员,请看一下这段我们刚刚抽象完的代码: Useruser=newUserInputDTOConvert().convert(userInputDTO); 你会发现,new 这样一

不知道在看完这段代码之后,读者有是否发现还有其他问题的存在,作为一个优秀的 Java 程序员,请看一下这段我们刚刚抽象完的代码:

  1. User user = new UserInputDTOConvert().convert(userInputDTO); 

你会发现,new 这样一个 DTO 转化对象是没有必要的,而且每一个转化对象都是由在遇到 DTO 转化的时候才会出现,那我们应该考虑一下,是否可以将这个类和 DTO 进行聚合呢,看一下我的聚合结果:

  1. public class UserInputDTO { 
  2. private String username; 
  3. private int age; 
  4.  public String getUsername() { 
  5.  return username; 
  6.  } 
  7.  public void setUsername(String username) { 
  8.  this.username = username; 
  9.  } 
  10.  public int getAge() { 
  11.  return age; 
  12.  } 
  13.  public void setAge(int age) { 
  14.  this.age = age; 
  15.  } 
  16.  public User convertToUser(){ 
  17.  UserInputDTOConvert userInputDTOConvert = new UserInputDTOConvert(); 
  18.  User convert = userInputDTOConvert.convert(this); 
  19.  return convert; 
  20.  } 
  21.  private static class UserInputDTOConvert implements DTOConvert<UserInputDTO,User> { 
  22.  @Override 
  23.  public User convert(UserInputDTO userInputDTO) { 
  24.  User user = new User(); 
  25.  BeanUtils.copyProperties(userInputDTO,user); 
  26.  return user; 
  27.  } 
  28.  } 

然后 API 中的转化则由:

  1. User user = new UserInputDTOConvert().convert(userInputDTO); 
  2. User saveUserResult = userService.addUser(user); 

变成了:

  1. User user = userInputDTO.convertToUser(); 
  2. User saveUserResult = userService.addUser(user); 

我们再 DTO 对象中添加了转化的行为,我相信这样的操作可以让代码的可读性变得更强,并且是符合语义的。

再查工具类

再来看 DTO 内部转化的代码,它实现了我们自己定义的 DTOConvert 接口,但是这样真的就没有问题,不需要再思考了吗?

我觉得并不是,对于 Convert 这种转化语义来讲,很多工具类中都有这样的定义,这中 Convert 并不是业务级别上的接口定义,它只是用于普通 bean 之间转化属性值的普通意义上的接口定义,所以我们应该更多的去读其他含有 Convert 转化语义的代码。

我仔细阅读了一下 GUAVA 的源码,发现了 com.google.common.base.Convert 这样的定义:

  1. public abstract class Converter<A, B> implements Function<A, B> { 
  2.  protected abstract B doForward(A a); 
  3.  protected abstract A doBackward(B b); 
  4.  //其他略 

从源码可以了解到,GUAVA 中的 Convert 可以完成正向转化和逆向转化,继续修改我们 DTO 中转化的这段代码:

  1. private static class UserInputDTOConvert implements DTOConvert<UserInputDTO,User> { 
  2.  @Override 
  3.  public User convert(UserInputDTO userInputDTO) { 
  4.  User user = new User(); 
  5.  BeanUtils.copyProperties(userInputDTO,user); 
  6.  return user; 
  7.  } 

修改后:

  1. private static class UserInputDTOConvert extends Converter<UserInputDTO, User> { 
  2.  @Override 
  3.  protected User doForward(UserInputDTO userInputDTO) { 
  4.  User user = new User(); 
  5.  BeanUtils.copyProperties(userInputDTO,user); 
  6.  return user; 
  7.  } 
  8.  @Override 
  9.  protected UserInputDTO doBackward(User user) { 
  10.  UserInputDTO userInputDTO = new UserInputDTO(); 
  11.  BeanUtils.copyProperties(user,userInputDTO); 
  12.  return userInputDTO; 
  13.  } 
  14.  } 

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读