如何降低这种方法的圈复杂度?

  • 本文关键字:复杂度 方法 何降低 java
  • 更新时间 :
  • 英文 :

private boolean checkForNameAndAmbigousInfo(final Attribute<NonSpatialObject> od,
final Attribute<NonSpatialObject> od1) {
if (isNameMatching(od, od1, getModel().FEATURES.SignpostInfo.OtherDestination)
&& (isAmbigous(od) && isAmbigous(od1)))
return true;
if (isNameMatching(od, od1, getModel().FEATURES.SignpostInfo.OtherDestination)
&& (!isAmbigous(od) && !isAmbigous(od1)))
return true;
if (isNameMatching(od, od1, getModel().FEATURES.SignpostInfo.OtherDestination)
&& (isAmbigous(od) && !isAmbigous(od1)))
return true;
if (isNameMatching(od, od1, getModel().FEATURES.SignpostInfo.OtherDestination)
&& (!isAmbigous(od) && isAmbigous(od1)))
return true;
return false;
}
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);
}

此方法存在声纳绒问题。该方法的周期复杂度为13,大于10

授权。我不知道我现在该做什么。

如果isNameMatching没有副作用:

boolean isNameMatching = isNameMatching(od, od1, getModel().FEATURES.SignpostInfo.OtherDestination);
return (isNameMatching && (isAmbigous(od) && isAmbigous(od1)))
|| (isNameMatching && (!isAmbigous(od) && !isAmbigous(od1)))
|| (isNameMatching && (isAmbigous(od) && !isAmbigous(od1)))
|| (isNameMatching && (!isAmbigous(od) && isAmbigous(od1)));

条件的第二部分看起来像一个bug。如果两者都是明确的,则返回真值。似乎错了。

可能是

boolean isNameMatching = isNameMatching(od, od1, getModel().FEATURES.SignpostInfo.OtherDestination);
return isNameMatching && (isAmbigous(od) || isAmbigous(od1));

您的第一个操作数始终相同,然后您测试A&B,!A&!B,A&!B!A&B,并在所有情况下返回true。不仔细看,我认为你的代码可能会减少到return isNameMatching(od, od1, …)(因为你的模糊调用将总是返回true至少一个条件)。在数学逻辑中,这被称为重言式(一个总是为真的陈述)。

(假设isNameMatching是幂等的,当然你的方法都没有副作用)。

你自己是怎么得出这个结论的?提取变量并转换为单个布尔表达式可能会有所帮助:

final boolean nameMatching = isNameMatching(od, od1, getModel().FEATURES.SignpostInfo.OtherDestination);
final boolean ambiguous1 = isAmbiguous(od);
final boolean ambiguous2 = isAmbiguous(od1);
return nameMatching && ambiguous1 && ambiguous2 
|| nameMatching && !ambiguous1 && !ambiguous2
|| nameMatching && ambiguous1 && !ambiguous2
|| nameMatching && !ambiguous1 && ambiguous2;

可以看到,至少有一个二义性检查必须为真(您正在检查所有四种可能性:TT, TF, FT, FF)。如果至少有一个or表达式为真,则最终结果只能是nameMatching && true,可以进一步简化为nameMatching

如果您不确定or表达式的推理,则可以提取公共术语:

final boolean nameMatching = isNameMatching(od, od1, getModel().FEATURES.SignpostInfo.OtherDestination);
final boolean ambiguous1 = isAmbiguous(od);
final boolean ambiguous2 = isAmbiguous(od1);
return nameMatching &&
(  ambiguous1 &&  ambiguous2 
|| !ambiguous1 && !ambiguous2
||  ambiguous1 && !ambiguous2
|| !ambiguous1 &&  ambiguous2);

现在应该很清楚,结果只能等于return nameMatching;

最新更新