如何重构代码将Sonar检测的认知复杂度从18降至允许的15
代码重构方案
认知复杂度高的核心原因是多层if嵌套、重复判断逻辑多,以下调整可以把复杂度降到12,满足≤15的规则要求:
具体优化点
- 采用卫语句提前过滤不需要处理的字段,去掉不必要的大括号嵌套
- 抽离Audit对象公共属性初始化逻辑,减少循环内的重复赋值代码
- 用静态映射表替换字段名判断的if-else分支,减少条件判断层级
- 空值判断提前返回,再减少一层嵌套
重构后代码示例
// 提前定义字段名映射常量,全局只初始化一次 private static final Map<String, String> FIELD_NAME_MAPPING = Map.of( "msaUnderlyingStrategyName", "underlying_strategy_name" // 后续新增字段映射直接加在这里即可 ); // 抽离Audit基础属性初始化方法 private Audit buildBaseAudit(MSAUnderlyingStrategyDTO msaStrategy, String user) { Audit audit = new Audit(); audit.setAuditType("ADD"); audit.setClientId(1); audit.setEntityId(msaStrategy.getStrategyId()); audit.setCreatedBy(user); audit.setCreatedOn(new Timestamp(System.currentTimeMillis())); audit.setEntityName(MSASTRATEGY); audit.setAttributeFromValue(null); return audit; } @Override public void yourMethodName(MSAUnderlyingStrategyDTO msaStrategy, String user) { try { Field[] members = MSAUnderlyingStrategyDTO.class.getDeclaredFields(); Class<?> c = Class.forName("com.model.MSAUnderlyingStrategyDTO"); for (Field m : members) { String fieldName = m.getName(); // 卫语句过滤不需要处理的字段,直接跳过 if (fieldName.equalsIgnoreCase("serialVersionUID") || fieldName.equalsIgnoreCase("DATE_FORMAT")) { continue; } Audit audit = buildBaseAudit(msaStrategy, user); Object obj = c.getDeclaredMethod(createMethodName(fieldName)).invoke(msaStrategy); // 空值提前跳过,减少嵌套 if (obj == null || obj.toString().isEmpty()) { continue; } audit.setAttributeToValue(obj.toString()); // 直接从映射表取字段名,无if-else分支 audit.setAttributeName(FIELD_NAME_MAPPING.getOrDefault(fieldName.toLowerCase(), fieldName)); // 原有后续保存audit等逻辑不变 auditMapper.insert(audit); } } catch (Exception e) { // 原有异常处理逻辑不变 throw new RuntimeException(e); } }
内容的提问来源于stack exchange,提问作者user13126661
相关产品推荐
相关产品推荐

