程序员到底该怎么培养自己的意识

225 阅读3分钟

一、前言

很多人会有这种疑问,领导安排的需求都能正常写完,不知道怎么提升了,代码也不知道怎么优化,今天鑫哥和大家分析下这个问题

二、案例

在回答这个问题之前,让我们先来看两个例子

1、业务日志记录

业务经常有这种需求,业务改了商品信息,需要记录变更的字段,比如商品名称由A改成B,商品价格由100改成50之类的,这样日志清晰明了,看一眼就知道谁在什么时间做了什么操作,一般代码如下

image.png 初步一看是不是感觉很清晰,一个字段一个字段对比,值不一样就记录到日志里去,这样就实现了产品的要求。

上面代码是一段真实的生产代码,不知道大家发现没有,好像格式都差不多,比较值相不相等,不相等就记录。是不是可以优化一下?如果你想到了这里,恭喜你,说明你思想不错(写不出来没关系,能想最重要)

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前端渲染,一个直接写入文件)

image.png

四、结论

从上面的例子可以看出,最重要的就是要观察能力和分析能力,写不出来没关系,可以想出来就行。随着能力的提高,这些想象中的东西会慢慢实现。

以前带过的一个小姑娘,有次找我,说产品经常变需求,有时候列表要分页,有时候又不要分页,代码改来改去的,问我能不能想办法处理一下这个问题(一般来说,分页不分页结构确实不一样)。后面我翻了下mybatisPlus的源码,整合封装了套代码,可以支持分页不分页前后端交互的结构一致,后端只有一套代码,前端用参数来控制要不要分页。

虽然她写不出来这套东西,但是她会思考会想这个情况啊,对于一个初级开发,这就够了,思考观察能力是程序员最重要的能力

五、结尾

觉得博主写得还可以的朋友可以点赞加个关注,后续会不断分享自己编程方面的一些经验。想要上面例子中源码或者交流的朋友可以加博主自己的交流Q群678214863