阅读《代码整洁之道》总结 (2)

正例采用卫语句减少了嵌套,但是并非所有场景都适合这样改写。如果不适合,可以将关联性高的逻辑抽取成一个独立的方法减少嵌套。

抽离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<Order> 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<Order> queryOrderByPage(OrderQueryDTO orderQueryDTO) { } 第三方库 Lombok

Lombok组件通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法
举例如下:
@Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
@Getter 使用方法同上,区别在于生成的是getter方法。
@ToString 注解在类,添加toString方法。
@EqualsAndHashCode 注解在类,生成hashCode和equals方法。
@NoArgsConstructor 注解在类,生成无参的构造方法。
@RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
@AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。
@Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。

常规写法: Public class Order { private Integer userId; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { return this.userId = userId; } } 采用Lombok: @Getter @Setter Public class Order { private Integer userId; } Apache Commons系列

  Apache Commons系列组件给我们提供了关于字符串、集合、IO操作等工具方法。这些组件是个大宝库,提供了不少轮子。

组件 介绍
beanUtils   JavaBean进行各种操作,克隆对象、属性等等  
codec   处理常用的编码方法的工具类包,例如DES、SHA1、MD5、Base64等.  
collections   java集合框架操作  
configuration   java应用程序的配置管理类库  
io   io工具的封装  
lang   Java基本对象方法的工具类包 如StringUtils、ArrayUtils等等.  
logging   提供的日志接口  
net   提供了客户端和服务器端的数据验证框架  
看看例子: 例1: 判断集合是否为空: CollectionUtils.isEmpty(null): true CollectionUtils.isEmpty(new ArrayList()): true CollectionUtils.isEmpty({a,b}): false 例2: 判断集合是否不为空: CollectionUtils.isNotEmpty(null): false CollectionUtils.isNotEmpty(new ArrayList()): false CollectionUtils.isNotEmpty({a,b}): true 例3:2个集合间的操作:  集合a: {1,2,3,3,4,5} 集合b: {3,4,4,5,6,7} CollectionUtils.union(a, b)(并集): {1,2,3,3,4,4,5,6,7} CollectionUtils.intersection(a, b)(交集): {3,4,5} CollectionUtils.disjunction(a, b)(交集的补集): {1,2,3,4,6,7} CollectionUtils.disjunction(b, a)(交集的补集): {1,2,3,4,6,7} CollectionUtils.subtract(a, b)(A与B的差): {1,2,3} CollectionUtils.subtract(b, a)(B与A的差): {4,6,7}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwxxw.html