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

背景:

最近业务不多,公司的老哥开始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;
}
意义:大型的项目,是需要几个人团队协作完成的,并且,会经历几代的迭代,高质量和规范的代码这时候就显得尤为重要了。
虽然,只是一个编码习惯上的小问题,但是还是在项目空闲的时候去尽量纠正这些问题,不然,当一个需求跑过来的时候,如何去
 
posted @ 2018-07-12 20:05  Ugly_Bear  阅读(169)  评论(0编辑  收藏  举报