欢迎关注我的公众号:Java开发者笔记
摘要
上周五公司也是公司一个月一次的学习日大会,这次学习日的主题是如何写出高质量代码;在学习日的中途呢,本人作为分享者,上去也是讲述了一篇关于这篇文章主题的故事---那些年专坑同事的前后端代码
在日常开发中,作为一个努力上班干活的牛马,一个忠实的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,在平时开发时就需要多注意这种问题;
欢迎在评论区留言截图截出你们开发中那些有意思的代码;