return userDTO; } Private UserDTO getUserBasicInfo(userId); Private UserLastOrder getUserLastOrder(userId); Private UserAccount getUserAccount(userId);
减少if/else嵌套
为什么要减少嵌套,难道嵌套看上去不时尚吗?我曾经看到某位同事的一段代码嵌套达到9层,他自己再去维护的时候都看晕了。代码过度嵌套的结果是只有原作者才能读懂,接盘侠一脸茫然。
看看反例:
// 修改用户密码,这个例子只有3层嵌套,很温柔了 public boolean modifyPassword(Integer userId, String oldPassword, String newPassword) { if (userId != null && StringUtils.isNotBlank(newPassword) && SpringUtils.isNotBlank(oldPassword)) { User user = getUserById(userId); if(user != null) { if(user.getPassword().equals(oldPassword) { return updatePassword(userId, newPassword) } } } }
看看正例:
// 修改用户密码 Public Boolean modifyPassword(Integer userId, String oldPassword, String newPassword) { if (userId == null || StringUtils.isBlank(newPassword) || StringUtils.isBlank(oldPassword)) { return false; } User user = getUserById(userId); if(user == null) { return false; } if(!user.getPassword().equals(oldPassword) { return false; } return updatePassword(userId, newPassword); }
正例采用卫语句减少了嵌套,但是并非所有场景都适合这样改写。如果不适合,可以将关联性高的逻辑抽取成一个独立的方法减少嵌套。
抽离try/catch
大家有没有见过一个超长的方法,从头到尾被一个try/catch照顾着?博主经历过的项目中,这种不负责的写法比比皆是。并非每行代码都会抛出错误,只要将会抛出错误的业务放在一个独立的方法即可。
看看反例:
// 获取个人信息 Private UserDTO getUserDTO(Integer userId) { try { //获取基本信息 … 此处写了10行 //获取最近的一次订单信息. …此处写了20行 // 获取钱包、可用优惠券张数等 …此处写了20行 }catch (Exception e) { logger.error(e); return null; } } return userDTO; }
看看正例:
// 获取个人信息 Private UserDTO getUserDTO(Integer userId) { //获取基本信息 UserDTO userDTO= getUserBasicInfo(userId); //获取最近的一次订单信息 userDTO.setUserLastOrder(getUserLastOrder(userId)); // 获取钱包、可用优惠券张数等 userDTO.setUserAccount(getUserAccount(userId)); return userDTO; } Private UserDTO getUserBasicInfo(userId); Private UserLastOrder getUserLastOrder(userId); Private UserAccount getUserAccount(userId){ try{ // TODO } catch( Exception e) { //TODO} }
封装多个参数
如果方法参数将超过3个,建议放在类中包装起来,否则再增加参数时,由于语义的强耦合会导致调用方语法错误。在后台管理中的分页查询接口,常常会有很多查询参数,而且有可能增加,封装起来是最好的。
看看反例:
// 分页查询订单 6个参数 Public Page queryOrderByPage(Integer current,Integer size,String productName,Integer userId,Date startTime,Date endTime,Bigdecimal minAmount ,Bigdecimal maxAmount) { }
看看正例:
@Getter @Setter Public class OrderQueryDTO extends PageDTO { private String productName; private Integer userId; private Date startTime; private Date endTime; private Bigdecimal minAmount ; private Bigdecimal maxAmount; } // 分页查询订单 6个参数 Public Page queryOrderByPage(OrderQueryDTO orderQueryDTO) { }
第三方库
Lombok
Lombok组件通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法
举例如下:
@Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
@Getter 使用方法同上,区别在于生成的是getter方法。
@ToString 注解在类,添加toString方法。
@EqualsAndHashCode 注解在类,生成hashCode和equals方法。