代码优化问题
1.业务需求
需要从用户表(实体类为MBDAuthorizeVo
)里查出所有用户,然后通过业务id(businessId
)在权限表(PermissionEntry
)查出有权限的用户id,在实体类MBDAuthorizeVo
中有权限的标记hasPermission
为True,默认都为False
2.原本代码
实习的时候, 脑子一抽写下了以下代码, 各位是否发现了什么问题
@Override
public List<MBDAuthorizeVo> getIdWithPermission(String businessId) {
List<Object> userIdList = new ArrayList<>();
if (StringUtils.isNotBlank(businessId)) {
LambdaQueryWrapper<PermissionEntry> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PermissionEntry::getBusinessId, businessId);
queryWrapper.select(PermissionEntry::getAuthorizeId);
userIdList = entryMapper.selectObjs(queryWrapper); //通过业务id查出权限表内对应的用户id
}
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<MBDAuthorizeVo> voList = sysBaseAPI.getAuthorizeUser(loginUser.getCompanycode()); //获取所有的用户数据
if (userIdList == null || userIdList.isEmpty()) {
return voList; //若权限表查不到对应的用户id,则所有数据均未授权,直接返回
} else {
for (MBDAuthorizeVo vo : voList) {
if (userIdList.contains(vo.getAuthorizeId())) {
vo.setHasPermission(true); //有权限的标记为True
}
}
return voList;
}
}
3.分析问题(今天review代码一看,这啥呀,一顿分析)
- 减少方法体内变量的作用域,这样当它们不再需要时,就可以更快地被垃圾收集器回收。
- 使用
Collection.isEmpty()
来检查集合是否为空,这比用null
检查更加安全且语义更清晰。 - 避免在一个大的
if-else
块中进行逻辑操作。可以先返回一个条件,这样就可以减少嵌套的深度并提高代码的可读性。
4.修改代码
- 把
userIdList
的创建移动到if
条件内部,因为只有在businessId
不为空时我们才需要这个集合。 - 将查询结果
userIdList
转换成Set<Object>
,用于查找操作,因为在集合中查找元素时,Set
的性能比List
更优。 - 简化了
if-else
逻辑,先检查businessId
是否为空,如果为空直接返回voList
,减少了不必要的查询和逻辑判断。这样做可以减少代码复杂度,降低认知负荷,让代码更易于阅读和维护。
public List<MBDAuthorizeVo> getIdWithPermission(String businessId) {
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<MBDAuthorizeVo> voList = sysBaseAPI.getAuthorizeUser(loginUser.getCompanycode());
if (StringUtils.isBlank(businessId)) {
return voList;
}
LambdaQueryWrapper<PermissionEntry> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PermissionEntry::getBusinessId, businessId).select(PermissionEntry::getAuthorizeId);
List<Object> userIdList = entryMapper.selectObjs(queryWrapper);
if (userIdList.isEmpty()) {
return voList;
}
Set<Object> userIdSet = new HashSet<>(userIdList);
for (MBDAuthorizeVo vo : voList) {
if (userIdSet.contains(vo.getAuthorizeId())) {
vo.setHasPermission(true);
}
}
return voList;
}