那些年专坑同事的前后端代码

44 阅读3分钟

欢迎关注我的公众号:Java开发者笔记

扫码_搜索联合传播样式-白色版.png

摘要

上周五公司也是公司一个月一次的学习日大会,这次学习日的主题是如何写出高质量代码;在学习日的中途呢,本人作为分享者,上去也是讲述了一篇关于这篇文章主题的故事---那些年专坑同事的前后端代码

在日常开发中,作为一个努力上班干活的牛马,一个忠实的crud全栈boy,或多或少的都会写一些高级代码,比如这个例子:

@Transactional
private String  saveOrder(OrderDto order) {
    // 获取已存在的订单信息
    OrderEntity orderEntity = orderMapper.selectOrderAssinfo(order.getOrderId());
    
    // ...数据校验
    AmountUtil.checkOrderAmount(orderEntity);
    
    // 更新订单
    orderMapper.updateOrderAssinfo(order);
    
    // 更新商品库存
    shopInfoFeign.updateShopInfo(order.getDetails());
    
    return "ok";
}

不要觉得离谱,这段代码既然是被写出来,那肯定是有原因的!!!

上面这段代码有三个坑:

第一:Transactional 加在private方法上,事务是不生效的,Spring的事务是基于动态代理,动态代理是无法代理private方法的,看似有事务,实则就是个吉祥物注解

第二:没有任何的异常捕获信息,再怎么也加一个try catch,不然金额校验失败,或者更新商品库存调用feign失败?怎么找报错? elk上到处找?

第三:我想说,是谁教你直接返回ok的???

当然,这次开会分享代码,我们是全程把git提交人名打了马赛克的。 毕竟谁还没犯个错是吧,作为程序员,dddd;

接下来,请你收好你的脑子,把接下来的代码当个乐子看就行。

大家一起看乐子

代码一:我给你写个jar包,你直接调我方法就行,我给你做好事务!

@Transactional(rollbackFor=Exception.class, propagation=Propagation.REQUIRED_NEW)
public void saveCwReportSetting(CwSetting setting) {
    // 获取历史配置
    CwSetting setting = mapper.selectReportSettingHis(setting.getCwId());
    
    // 组装历史配置数据
    CwSetting newSetting = new CwSetting();
    this.build(setting,newSetting);
    
    // 保存
    mapper.save(newSetting);
}

上面这段代码,是我们的一个实习生写出的,财务服务提供给订单服务的报表导出配置,采用jar包形式,避免分布式事务问题;只能说这段代码的哥们,对事务了解还是不够透彻,propagation 明明默认值就能解决的问题,还得自己写个REQUIRED_NEW


代码二:魔法枚举你见过吗? 震撼你一整年

public enum DocumentStateEnum implents CodeEnum {
    ZERO(0,"草稿");
    ONE(1,"待审核");
    TWO(2,"已审核");
    THREE(3,"已核算");
    FOUR(4,"红冲");
    FIVE(5,"归档");
    
    public final Integer code;
    public final String desc;
    
    public Integer getCode(){
        return this.code;
    }
    
    public String getDesc(){
        return this.desc;
    }
}

只能说,枚举定义是没问题的,但是这个命名着实有点看不懂了;


代码三:牛唇不对马嘴,起名和使用方式没有任何关系

public enum SaleBuyEnum implents CodeEnum {
    AfterSuccessSend(37"重算并延迟发货");
}

写这代码的哥们,可能是忘记改名了,能理解,能理解;


代码四:前端js的new Date 到底是加括号还是不加括号?

initialize: function(){
    var date = $common.caclDate(new Date,0,0,1);
    this.get_form().beginDate.set_value(date);
}

有无大佬能帮我看看,这里加括号和不加括号到底有啥区别?


代码五:生命周期内大量的网络请求带来的慢加载问题

context: function (){
    $common.ajaxSync("otype/list",request);
    $common.ajaxSync("otype/list2",request);
    $common.ajaxSync("otype/list3",request);
    $common.ajaxSync("otype/list4",request);
    $common.ajaxSync("otype/list5",request);
}

如果对上述函数不太能理解的,你就想象成在vue2的语法中,将大量的同步函数放在了 created 中;


代码六:for循环也是可以优化的

public void buildOrderDto(){
    List<OrderDto> orders = mapper.listOrders();
    
    List<OrderDetail> orderDetails = mapper.listDetails();
    
    for (OrderDto order:orders) {
        for (OrderDetail detail:orderDetails) {
            if (detail.getOrderId.compareTo(order.getId()) == 0) {
                order.getDetails.add(detail);
            }
        }
    }
}

相信这样的写法,你们的代码中也肯定有数据,咱就是说,stream流转Map是不好用了吗


代码七:不需要的配置就不用加载

List<SysConfig> configs = mapper.getAllSysConfig();
SysConfig configDto = null;
for (SysConfig config:configs) {
    if (config.getSubName.equals("replenishmentTime")) {
        configDto = config;
        break;
    }
}

其实完全可以在mapper里面加一个参数就能解决的问题,唯一能写出这个代码的人,我只能这么理解,这个getAllSysConfig方法是人家的,你只是不想改

结语

代码质量并不是一个简单的小事,作为一个crud boy,在平时开发时就需要多注意这种问题;

欢迎在评论区留言截图截出你们开发中那些有意思的代码;