• 代码简洁之道-八项提高代码可读性的规范建议
  • 发布于 1周前
  • 30 热度
    0 评论
一.方法体建议不要太长
1.定义的方法最好不要超过80行,因为超过80行,阅读性就会变差
2.方法里面的内容尽量只做一件事,不要把一堆逻辑全部放到一个方法中,不利于后面的的代码复用
可以使用ctrl+alt+m 抽取方法

二.使用 if return 代替 嵌套 if
像这样的代码,看起来是不是很累:
public Order getOrderInfo(String id){
    Order order = orderService.getOrder(id);
    if (Objects.nonNull(order)){ 
        UserInfo userInfo = userService.getUserInfo(order.getUserId());
        if (Objects.nonNull(userInfo)){
            Account account = accountService.getAccount(userInfo.getAccountId());
            if (Objects.nonNull(account)) {
                order.setAccountName(account.getAccountName());
            }
        }
    }
    return order;
}
我们可以改成这样:看起来是不是清爽多了
public Order getOrderInfo(String id) {
   // 堆代码 duidaima.com
    Order order = orderService.getOrder(id);
    if (Objects.isNull(order)) {
        return null;
    }
    UserInfo userInfo = userService.getUserInfo(order.getUserId());
    if (Objects.isNull(userInfo)) {
        return order;
    }
    Account account = accountService.getAccount(userInfo.getAccountId());
    if (Objects.nonNull(account)) {
        order.setAccountName(account.getAccountName());
    }
    return order;
}
三.多使用空指针判断,能避免绝大数程序问题
空指针其实是让人后头疼的事,一旦出现空指针,如果程序没有捕获到,就有可能导致很严重的产线事故 哪些地方需要用空指针判断:
1.方法的入口,对传参进行空指针判断
2.接收方法的返回值,要进行空指针判断
3.调用方法之前,调用方要对入参进行空指针判断
4.对象级联调用,如a.getB().getC(); 需要对a和 getB()的返回值进行控制着判断
5.从集合中获取的如果是对象,要进行空指针判断,搞不好里面就被塞了一个空对象
四.判断字符串是否相等,建议使用StringUtils.equals() 

原因:

1.省去外部的空对象判断逻辑

2.里面比较逻辑性能更高
// 堆代码 duidaima.com
public static boolean equals(CharSequence cs1, CharSequence cs2) {
    if (cs1 == cs2) {
        return true;
    } else if (cs1 != null && cs2 != null) {
        if (cs1.length() != cs2.length()) {
            return false;
        } else if (cs1 instanceof String && cs2 instanceof String) {
            return cs1.equals(cs2);
        } else {
            int length = cs1.length();

            for(int i = 0; i < length; ++i) {
                if (cs1.charAt(i) != cs2.charAt(i)) {
                    return false;
                }
            }

            return true;
        }
    } else {
        return false;
    }
}
五.如果if条件太复杂,建议抽成方法,去判断,或者定义一个变量
if(a!=null && b && c.equals("sss") && d && e){
 do something...
}
上面的代码可以抽成这样
boolean flag = a!=null && b && c.equals("sss") && d && e;
if(flag){
 do something...
}
六.如果有大量if else 出现,可以考虑使用策略模式,仅适用于if里面的代码很多或复杂,不要滥用
策略模式一般遵循如下使用流程:
.定义一个接口,包含业务方法和一个处理类型的返回方法
public interface OrderStrategy {
    void doSomething();
    String getType();
}
.定义不同的策略实现策略接口
// 堆代码 duidaima.com
public class JdOrderStrategy implements OrderStrategy{
    @Override
    public void doSomething() {
    }
    @Override
    public String getType() {
        return "jd";
    }
}

public class PddOrderStrategy implements OrderStrategy{
    @Override
    public void doSomething() {
    }

    @Override
    public String getType() {
        return "pdd";
    }
}

public class TbOrderStrategy implements OrderStrategy{
    @Override
    public void doSomething() {
    }

    @Override
    public String getType() {
        return "tb";
    }
}
.创建一个helper 去装载这些策略
@Service
public class OrderStrategyHelper {
    private Map<String, OrderStrategy> orderStrategyMap;
    @Autowired
    public void setOrderStrategyMap(List<OrderStrategy> orderStrategyList) {
        if (CollectionUtils.isEmpty(orderStrategyList)) {
            throw new RuntimeException("没找到订单策略");
        }
        orderStrategyMap = orderStrategyList.stream().collect(Collectors.toMap(item -> item.getType(), item -> item, (v1, v2) -> v1));
    }
    
    public OrderStrategy getHandler(String type){
        return orderStrategyMap.get(type);
    }
}
如何去用
orderStrategyHelper.getHandler("jd")
七.如果有大量类型判断,建议将类型定义为枚举,便于维护
八.尽量使用业务代码组装结果代替多表联合查询
1.方便进行索引优化,写出更高效sql
2.为后续进行分库分表留出接口。(如果有需要的话)
用户评论