BeanUtils.copyProperties 是一个浅拷贝要领,复制属性时,我们只必要把 DTO 工具和要转化的工具两个的属性值配置为一样的名称,而且担保一样的范例就可以了。假如你在做 DTO 转化的时辰一向行使 set 举办属性赋值,那么请实行这种方法简化代码,让代码越发清楚!
转化的语义
上边的转化进程,读者看后必定认为优雅许多,可是我们再写 Java 代码时,更多的必要思量语义的操纵,再看上边的代码:
- User user = new User();
- BeanUtils.copyProperties(userInputDTO,user);
固然这段代码很好的简化和优化了代码,可是他的语义是有题目的,我们必要提现一个转化进程才好,以是代码改成如下:
- @PostMapping
- public User addUser(UserInputDTO userInputDTO){
- User user = convertFor(userInputDTO);
- return userService.addUser(user);
- }
- private User convertFor(UserInputDTO userInputDTO){
- User user = new User();
- BeanUtils.copyProperties(userInputDTO,user);
- return user;
- }
这是一个更好的语义写法,固然他贫困了些,可是可读性大大增进了,在写代码时,我们应该只管把语义条理差不多的放到一个要领中,好比:
- User user = convertFor(userInputDTO);
- return userService.addUser(user);
这两段代码都没有袒露实现,都是在讲如安在统一个要领中,做一组沟通条理的语义操纵,而不是袒露详细的实现。
如上所述,是一种重构方法,读者可以参考 Martin Fowler 的《Refactoring Imporving the Design of Existing Code》(重构 改进既有代码的计划) 这本书中的 Extract Method 重构方法。
抽象接口界说
当现实事变中,完成了几个 API 的 DTO 转化时,我们会发明,这样的操纵有许多许多,那么应该界说好一个接口,让全部这样的操纵都有法则的举办。
假如接口被界说往后,那么 convertFor 这个要领的语义将发生变革,它将是一个实现类。
看一下抽象后的接口:
- public interface DTOConvert<S,T> {
- T convert(S s);
- }
固然这个接口很简朴,可是这里汇报我们一个工作,要去行使泛型,假如你是一个优越的 Java 措施员,请为你想做的抽象接口,做好泛型吧。
我们再来看接话柄现:
- public class UserInputDTOConvert implements DTOConvert {
- @Override
- public User convert(UserInputDTO userInputDTO) {
- User user = new User();
- BeanUtils.copyProperties(userInputDTO,user);
- return user;
- }
- }
我们这样重构后,我们发明此刻的代码是云云的简捷,而且那么的类型:
- @RequestMapping("/v1/api/user")
- @RestController
- public class UserApi {
- @Autowired
- private UserService userService;
- @PostMapping
- public User addUser(UserInputDTO userInputDTO){
- User user = new UserInputDTOConvert().convert(userInputDTO);
- return userService.addUser(user);
- }
- }
review code
假如你是一个优越的 Java 措施员,我信托你应该和我一样,已经数次一再 review 过本身的代码许多次了。
我们再看这个生涯用户的例子,你将发明,API 中返回值是有些题目的,题目就在于不该该直接返回 User 实体,由于假如这样的话,就袒露了太多实体相干的信息,这样的返回值是不安详的,以是我们更应该返回一个 DTO 工具,我们可称它为 UserOutputDTO:
- @PostMapping
- public UserOutputDTO addUser(UserInputDTO userInputDTO){
- User user = new UserInputDTOConvert().convert(userInputDTO);
- User saveUserResult = userService.addUser(user);
- UserOutputDTO result = new UserOutDTOConvert().convertToUser(saveUserResult);
- return result;
- }
这样你的 API 才更健全。 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|