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