减少表达式中使用的条件运算符 (4) 的数量(允许的最大值为 3)


如何

降低运算符的复杂性? 我有一个条件问题。

Object someObject = getSomeObject();
boolean isNotInstanceOfA = !(someObject instanceof A);
boolean isNotInstanceOfB = !(someObject instanceof B);
boolean isNotInstanceOfC = !(someObject instanceof C);
boolean isNotInstanceOfABC = isNotInstanceOfA && isNotInstanceOfB && isNotInstanceOfC;
if (isNotInstanceOfABC && (container.getChildren(itemId) == null || container.getChildren(itemId).isEmpty())) {
    return "something";
 }

itemId 是否是基元类型? 我猜它不是原始的,要减少代码,您可以将此 null 或空检查移动到单独的方法并返回布尔值.. 您还可以减少一些代码,如下所示: '

    boolean isNotInstanceOfABC = !(someObject instanceof A) && !(someObject instanceof B) && !(someObject instanceof C);
    if (isNotInstanceOfABC && isEmptyOrNull(container.getChildren(itemId))) {
        return "something";
    }`

您实际上可以在if块之前计算条件,以便代码更具可读性,如下所示:

boolean isChildNull = (container.getChildren(itemId) == null);
boolean isChildEmpty = (isChildNull || container.getChildren(itemId).isEmpty());
if (isNotInstanceOfABC && isChildEmpty) {
    return "something";
}

但是,我从您的代码中推断您做错了什么,因为您正在执行大量instanceof检查,这根本不是一个好的做法,您可能需要考虑重构您的代码,如此处所述(用多态替换条件(。

不确定这是否适合您,但我会尝试以这种方式重构代码:

Object someObject = getSomeObject();
if (isInstanceOfABC(someObject)) {
    log.debug("Instance of A, B or C");
    return;
}
if (childrenIsEmptyOrNull( container.getChildren(itemId) ) {
    log.debug("Children is null or empty");
    return;
}
return "something";

private boolean isInstanceOfABC(Object someObject) {
    return someObject instanceof A
            || someObject instanceof B
            || someObject instanceof C;
}

private boolean childrenIsEmptyOrNull(Children children) {
    return children == null || children.isEmpty();
}

然而

使用instance of是一种代码异味。每当我看到这样的结构时,我确信出了什么问题。你最好现在停下来,在多态性的帮助下摆脱所有这些检查。

规范化你的逻辑表达式,然后使用以下方法

public boolean AND_Operator(boolean ...values) {
        for (boolean b : values) {
            if(!b)
                return false;
        }
        return true;
    }
    public static boolean OR_Operator(boolean ...values) {
        for (boolean b : values) {
            if(b)
                return true;
        }
        return false;
    }

最新更新