java 如何降低这个方法的圈复杂度

rxztt3cl  于 2023-01-16  发布在  Java
关注(0)|答案(2)|浏览(214)
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
授权,我现在该怎么办.

j8ag8udp

j8ag8udp1#

如果名称匹配没有副作用:

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));
2wnc66cl

2wnc66cl2#

第一个操作数总是相同的,然后测试A&B!A&!BA&!B!A&B,在所有情况下都返回true。我认为您的代码可能会缩减为return isNameMatching(od, od1, …)(因为对于至少一个条件,不明确的调用总是返回true)。在数学逻辑中,这称为tautology(总是正确的陈述)。
(当然,考虑到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),如果至少有一个或表达式为真,则最终结果只能是nameMatching && true,可以进一步简化为简单的nameMatching
如果你不确定关于或表达式的推理,可以提取出常用术语:

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;

相关问题