• 一个该不该抽出来的函数引起的思考


    背景:

    最近业务不多,公司的老哥开始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;
    }
    意义:大型的项目,是需要几个人团队协作完成的,并且,会经历几代的迭代,高质量和规范的代码这时候就显得尤为重要了。
    虽然,只是一个编码习惯上的小问题,但是还是在项目空闲的时候去尽量纠正这些问题,不然,当一个需求跑过来的时候,如何去
     
  • 相关阅读:
    通过dockerfile制作nginx镜像
    docker存储卷
    docker容器网络配置
    状态模式
    抽象工厂模式
    观察者模式
    建造者模式
    外观模式
    模板方法模式
    原型模式
  • 原文地址:https://www.cnblogs.com/Ugly-bear/p/9301636.html
Copyright © 2020-2023  润新知