如何降低checkForNameAndAmbigousInfo方法的圈复杂度?SonarLint告警
降低圈复杂度的优化方案
问题分析
原方法checkForNameAndAmbigousInfo的圈复杂度超标,核心原因是重复判断isNameMatching条件,且冗余枚举了isAmbigous的所有布尔组合——四个分支覆盖了od和od1是否模糊的全部可能性(两布尔值共4种组合),本质上只要isNameMatching为true,无论两个对象的模糊状态如何,都会返回true。
优化步骤
- 提取重复判断:提前计算
isNameMatching的结果,避免重复调用同一方法,减少冗余分支。 - 简化逻辑表达式:由于四个分支的
isAmbigous组合覆盖了所有可能情况,因此只要isNameMatching为true,直接返回true即可,无需逐一枚举分支。
优化后的代码
private boolean checkForNameAndAmbigousInfo(final Attribute<NonSpatialObject> od, final Attribute<NonSpatialObject> od1) { // 提前计算名字匹配结果,避免重复调用 boolean namesMatch = isNameMatching(od, od1, getModel().FEATURES.SignpostInfo.OtherDestination); // 只要名字匹配,无论模糊状态如何都返回true return namesMatch; } private boolean isAmbigous(final Attribute<NonSpatialObject> currSignInfo) { final DictionaryRangeItem ambiAttribute = getToolkit().getDictionaryTools().getDictionaryRangeItemFromComposite(currSignInfo, getModel().FEATURES.SignpostInfo.AmbiguousInfo); return ambiAttribute.equals(getModel().RANGES.AmbiguousInfo.Ambiguous); }
补充说明
如果原代码逻辑确实是名字匹配时,无论两个对象是否模糊都返回true,上述优化完全等价于原逻辑,且圈复杂度直接降至2,完全满足SonarLint的阈值要求。若后续需求调整(比如需要排除特定模糊组合),可再针对性修改逻辑。
内容的提问来源于stack exchange,提问作者deepankar gautam
相关产品推荐
相关产品推荐

