zoukankan      html  css  js  c++  java
  • 一个该不该抽出来的函数引起的思考

    背景:

    最近业务不多,公司的老哥开始review我的代码。受到了一顿教育(其实是因为我前段时间搞了个bug.....)

    场景:

    需要写一个利用redis自增得到id并保存到数据库的功能。

    很简单,在AppConfigManager类里面代码如下:

    /**
    * 从redis里面得到自增的Id
    * @return
    */
    public Integer getId(){
    Long longId =redis.incr(CacheUtil.getIdKey());
    return longId != null ? longId.intValue() : null;
    }

    当然前面在系统启动的时候需要一行:

    redis.set(CacheUtil.getIdKey(), AppConfigRepository.getMaxAppId());


    那么问题来了:当我在数据库里面保存id的时候,如果重复了该怎么处理?
    (当然一般是不会重复的,只有在手动修改数据的时候会有触发重复的可能。)
    我的
    * 新增规 * 利用redis的incr实现appId的自 * @param query
     * @return
    */
    @Override
    public AppConfig saveWXAppConfig(AppConfigQuery query) {

    if(wxAppConfigRepository.getByAppId(appConfig.getAppId())!= null){
    log.error("appId 重复! appId! appConfig:{}", appConfig);
         redis.set(CacheUtil.getIdKey(), wxAppConfigRepository.getMaxAppId());
         appConfig.setAppId(appConfigManager.getAppId());
    }
        return wxAppConfigRepository.saveWXAppConfig(appConfig);
    );
    }
    注意红色的部分:这里我先将redis里面的值更新到最大值,然后在去AppConfigManager类里面getId()一次,那么,此时得到的就是最新的不会重复的id了。
    这里师兄说:链路太长,代码可读性太差。
    当时我的内心全是问号❓❓❓❓❓❓
    就两行代码会导致可读性变差?虽然我也知道这样可读性的确很差,但是为了保证代码的可复用。我选择这样写。
    经师兄纠正:复用代码的优先级是低于可读性的!!!
    后改正如下:
    /**
    * 新增规则:
    * 利用redis的incr实现appId的自增
    * @param query
    * @return
    */
    @Override
    public AppConfig saveWXAppConfig(WXAppConfigQuery query) {
    AppConfig appConfig = convertToAppConfig(query);
    if(wxAppConfigRepository.getByAppId(appConfig.getAppId())!= null){
    log.error("appId 重复! appId! appConfig:{}", appConfig);
    appConfig = resetAppId(appConfig);
    }
    return wxAppConfigRepository.saveWXAppConfig(appConfig);

    }
    /**
    * 在redis里面设置新的appId,
    * 利用getAppId方法,返回自增的appID
    * @param appConfig
    * @return
    */
    private AppConfig resetAppId(AppConfig appConfig) {
    String appIdKey = CacheUtil.getAppIdKey();
    redis.set(appIdKey, wxAppConfigRepository.getMaxAppId());
    appConfig.setAppId(appConfigManager.getAppId());
    return appConfig;
    }
    意义:大型的项目,是需要几个人团队协作完成的,并且,会经历几代的迭代,高质量和规范的代码这时候就显得尤为重要了。
    虽然,只是一个编码习惯上的小问题,但是还是在项目空闲的时候去尽量纠正这些问题,不然,当一个需求跑过来的时候,如何去
     
  • 相关阅读:
    Unity Notes调制粒子系统的颗粒的最大数目
    Swift编程语言学习2.1——基础运营商(在)
    JavaScript语言基础知识6
    算法题:合并两个有序列表
    DDFT
    Java For循环效率试验
    Delphi ORD
    Delphi TcxTreeList 节点添加图片
    SQL Server 除法 不起作用的问题
    Delphi 继承基类的窗体,并显示基类的控件操作。
  • 原文地址:https://www.cnblogs.com/Ugly-bear/p/9301636.html
Copyright © 2011-2022 走看看