| 
                         不知道在看完这段代码之后,读者有是否发现还有其他问题的存在,作为一个优秀的 Java 程序员,请看一下这段我们刚刚抽象完的代码: 
- User user = new UserInputDTOConvert().convert(userInputDTO); 
 
  
你会发现,new 这样一个 DTO 转化对象是没有必要的,而且每一个转化对象都是由在遇到 DTO  转化的时候才会出现,那我们应该考虑一下,是否可以将这个类和 DTO 进行聚合呢,看一下我的聚合结果: 
- public class UserInputDTO { 
 - private String username; 
 - private int age; 
 -  public String getUsername() { 
 -  return username; 
 -  } 
 -  public void setUsername(String username) { 
 -  this.username = username; 
 -  } 
 -  public int getAge() { 
 -  return age; 
 -  } 
 -  public void setAge(int age) { 
 -  this.age = age; 
 -  } 
 -  public User convertToUser(){ 
 -  UserInputDTOConvert userInputDTOConvert = new UserInputDTOConvert(); 
 -  User convert = userInputDTOConvert.convert(this); 
 -  return convert; 
 -  } 
 -  private static class UserInputDTOConvert implements DTOConvert<UserInputDTO,User> { 
 -  @Override 
 -  public User convert(UserInputDTO userInputDTO) { 
 -  User user = new User(); 
 -  BeanUtils.copyProperties(userInputDTO,user); 
 -  return user; 
 -  } 
 -  } 
 - } 
 
  
然后 API 中的转化则由: 
- User user = new UserInputDTOConvert().convert(userInputDTO); 
 - User saveUserResult = userService.addUser(user); 
 
  
变成了: 
- User user = userInputDTO.convertToUser(); 
 - User saveUserResult = userService.addUser(user); 
 
  
我们再 DTO 对象中添加了转化的行为,我相信这样的操作可以让代码的可读性变得更强,并且是符合语义的。 
再查工具类 
再来看 DTO 内部转化的代码,它实现了我们自己定义的 DTOConvert 接口,但是这样真的就没有问题,不需要再思考了吗? 
我觉得并不是,对于 Convert 这种转化语义来讲,很多工具类中都有这样的定义,这中 Convert 并不是业务级别上的接口定义,它只是用于普通  bean 之间转化属性值的普通意义上的接口定义,所以我们应该更多的去读其他含有 Convert 转化语义的代码。 
我仔细阅读了一下 GUAVA 的源码,发现了 com.google.common.base.Convert 这样的定义: 
- public abstract class Converter<A, B> implements Function<A, B> { 
 -  protected abstract B doForward(A a); 
 -  protected abstract A doBackward(B b); 
 -  //其他略 
 - } 
 
  
从源码可以了解到,GUAVA 中的 Convert 可以完成正向转化和逆向转化,继续修改我们 DTO 中转化的这段代码: 
- private static class UserInputDTOConvert implements DTOConvert<UserInputDTO,User> { 
 -  @Override 
 -  public User convert(UserInputDTO userInputDTO) { 
 -  User user = new User(); 
 -  BeanUtils.copyProperties(userInputDTO,user); 
 -  return user; 
 -  } 
 - } 
 
  
修改后: 
- private static class UserInputDTOConvert extends Converter<UserInputDTO, User> { 
 -  @Override 
 -  protected User doForward(UserInputDTO userInputDTO) { 
 -  User user = new User(); 
 -  BeanUtils.copyProperties(userInputDTO,user); 
 -  return user; 
 -  } 
 -  @Override 
 -  protected UserInputDTO doBackward(User user) { 
 -  UserInputDTO userInputDTO = new UserInputDTO(); 
 -  BeanUtils.copyProperties(user,userInputDTO); 
 -  return userInputDTO; 
 -  } 
 -  } 
 
                          (编辑:91站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |