一、前言
很多人会有这种疑问,领导安排的需求都能正常写完,不知道怎么提升了,代码也不知道怎么优化,今天鑫哥和大家分析下这个问题
二、案例
在回答这个问题之前,让我们先来看两个例子
1、业务日志记录
业务经常有这种需求,业务改了商品信息,需要记录变更的字段,比如商品名称由A改成B,商品价格由100改成50之类的,这样日志清晰明了,看一眼就知道谁在什么时间做了什么操作,一般代码如下
初步一看是不是感觉很清晰,一个字段一个字段对比,值不一样就记录到日志里去,这样就实现了产品的要求。
上面代码是一段真实的生产代码,不知道大家发现没有,好像格式都差不多,比较值相不相等,不相等就记录。是不是可以优化一下?如果你想到了这里,恭喜你,说明你思想不错(写不出来没关系,能想最重要)
2、列表数据导出
再看一个数据导出的例子,数据的查出时常会有导出的需求,比如订单列表,用户列表等。一般的写法是重新写一个api进行导出操作,先查询数据,再用excel组件导出
@Override
public R exportExcel(StoreSearchBO req, HttpServletResponse response) {
req.setCurrent(NumberConstant.ONE);
req.setSize(NumberConstant.FIVE_THOUSAND);
Page<StoreVO> storeVOPage = listByPage(req);
List<StoreVO> records = storeVOPage.getRecords();
LinkedList<String> titles = new LinkedList<>(Arrays.asList("序号", "商户编码", "商户名称",
"平台门店编码", "本地门店名称", "本地门店编码", "关联门店编码"));
List<List<Object>> results = new ArrayList<>();
if (CollUtil.isNotEmpty(records)){
for (StoreVO record : records) {
List<Object> export = new LinkedList<>();
//序号
export.add(record.getId());
//商户编码
export.add(record.getTenantCode());
//商户名称
export.add(record.getTenantName());
//平台门店编码
export.add(record.getStoreCode());
//平台门店名称
export.add(record.getAreaName());
//本地门店编码
export.add(record.getAreaCode());
//关联门店编码
export.add(record.getAssociatedStores());
results.add(export);
}
}
String fileName = "美团门店数据导出-"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("MMddHHmm")) +".xls";
if (Objects.equals(req.getPlatCode(),ThirdPlatformCommonConst.THIRD_PLAT_DY)){
fileName = "抖店门店数据导出-"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("MMddHHmm")) +".xls";
}
try {
ExcelUtils.export(response, results, titles, null,
fileName, 1);
} catch (Exception e) {
log.warn(String.valueOf(e));
return R.error("导出失败" + e.getMessage());
}
return R.success("导出成功!");
}
查数据,设置表头,写数据,是不是逻辑很清晰?(这段代码问题挺多的,这里不展开了)几乎所有的导出都是这个逻辑。同上面2.1的日志场景一样,这里是不是也能优化一下?当然可以
有想法才能有创造力,觉得代码就应该这样写,理所当然,这种思想不改变的话技术很难提高
三、优化效果
一行代码就可以实现自动对比功能,可以自定义添加比较器,展示器,对比字段,自动对比
try {
FieldCompareUtils.CompareResult compare = FieldCompareUtils.compare(oldTransferDetail, newDetail);
String difference = compare.getDifference();
if (StringUtils.isNotBlank(difference)) {
logMessageList.add(difference);
}
} catch (Exception e) {
e.printStackTrace();
}
数据导出,也是几行代码就完了,使用已有的查询接口(导出和查询本来就是一个逻辑,只是展示的格式不同,一个用json前端渲染,一个直接写入文件)
四、结论
从上面的例子可以看出,最重要的就是要观察能力和分析能力,写不出来没关系,可以想出来就行。随着能力的提高,这些想象中的东西会慢慢实现。
以前带过的一个小姑娘,有次找我,说产品经常变需求,有时候列表要分页,有时候又不要分页,代码改来改去的,问我能不能想办法处理一下这个问题(一般来说,分页不分页结构确实不一样)。后面我翻了下mybatisPlus的源码,整合封装了套代码,可以支持分页不分页前后端交互的结构一致,后端只有一套代码,前端用参数来控制要不要分页。
虽然她写不出来这套东西,但是她会思考会想这个情况啊,对于一个初级开发,这就够了,思考观察能力是程序员最重要的能力
五、结尾
觉得博主写得还可以的朋友可以点赞加个关注,后续会不断分享自己编程方面的一些经验。想要上面例子中源码或者交流的朋友可以加博主自己的交流Q群678214863