logo头像

Always believe youself.

转-代码整洁之道

本文于601天之前发表,文中内容可能已经过时。

  • 合适的命名

    看看反例:
    
    // 手机号
    String phone = “13421800409”;
    // 获取地址
    private String getDiZhi();
    //修改密码
    private void modifyPassword(String password1 ,String password2)
    看看正例:
    
    // 手机号 mobileNo比phone更精确
    String mobileNo= “13421800409”;
    
    // 避免英文拼音混杂
    private String getAddress();
    
    // 参数的命名要区分意义
    private void modifyPassword(String oldPassowrd,String newPassword)
    
  • 短小的方法

    看看反例:
    
    //  获取个人信息
    Private UserDTO getUserDTO(Integer userId)
    {
        //获取基本信息 
        … 此处写了10行
    
        //获取最近的一次订单信息
        …  此处写了30行
    
       // 获取钱包余额、可用优惠券张数等
        ...   此处写了30行
    
       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);
    
  • 减少if/else嵌套

    看看反例:
    
    // 修改用户密码,这个例子只有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

    看看反例:
    
    //  获取个人信息
    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) {

}

-Apache Commons系列

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

iamge

看看例子:

例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}