java - 降低此方法的 boolean 表达式复杂度?

标签 java algorithm

此 isValid() 方法最多可设置 6 个属性以进行验证。如果未设置特定属性,则不需要对其进行验证。逻辑似乎按照我希望的方式工作。如何降低此方法的 boolean 表达式复杂度?

import java.util.ArrayList;
import java.util.List;

public class Valid {

private int foo;
private int bar;
private int foobar;
private String foofoo;
private String barbar;
private String foobarfoobar;

private int myfoo;
private int mybar;
private int myfoobar;
private String myfoofoo;
private List<String> mybarbarlist = new ArrayList<String>();
private String myfoobarfoobar;

private boolean validate;

public boolean isValid() {

    validate = false;

    if ((((foo > 0) && (foo == myfoo)) || (foo == 0))
            && (((bar > 0) && (bar == mybar)) || (bar == 0))
            && (((foobar > 0) && (foobar == myfoobar)) || (foobar == 0))
            && (((foofoo != null) && (foofoo.equals(myfoofoo))) || (foofoo == null))
            && (((barbar != null) && (mybarbarlist.contains(barbar))) || (barbar == null))
            && (((foobarfoobar != null) && (foobarfoobar
                    .equals(myfoobarfoobar))) || (foobarfoobar == null)))
        validate = true;
    return validate;
}

public static void main(String[] args) {

    Valid valid = new Valid();

    // valid.foo = 1;
    // valid.bar = 1;
    // valid.foobar = 1;
    // valid.foofoo = "1";
    // valid.barbar = "1";
    // valid.foobarfoobar = "1";

    // valid.myfoo = 1;
    // valid.mybar = 1;
    // valid.myfoobar = 1;
    // valid.myfoofoo = "1";
    // valid.mybarbarlist.add("1");
    // valid.myfoobarfoobar = "1";

    System.out.println(valid.isValid());
}
}

最佳答案

我会首先为每个子表达式赋予有意义的名称并将结果分配给变量,然后在变量之间进行 && 检查。这将大大增加可读性。

而且你的条件似乎都有这种形式

(X != null && X == value) || X == null

可以使用短路评估将其简化为

X == null || X == value

因为如果X == null评估为真则不需要检查右侧,或者如果 X == null计算结果为 false,它需要检查右侧,您已经知道它不为 null,因此您不需要检查右侧表达式中的 null。

结合两者你会得到这样的东西:

public boolean isValid() {

    validate = false;

    boolean fooCond = (foo == 0) || (foo == myfoo);
    boolean barCond = (bar == 0) || (bar == mybar);
    boolean foobarCond = (foobar == 0) || (foobar == myfoobar);
    boolean foofooCond = (foofoo == null) || foofoo.equals(myfoofoo);
    boolean barbarCond = (barbar == null) || mybarbarlist.contains(barbar);
    boolean foobarfoobarCond = (foobarfoobar == null) || foobarfoobar.equals(myfoobarfoobar);

    if (fooCond
          && barCond
          && foobarCond
          && foofooCond;
          && barbarCond
          && foobarfoobarCond) {
        validate = true;
    }

    return validate;
}

编辑

这对您要检查的表达式不太有效

((foo > 0) && (foo == myfoo)) || (foo == 0)

因为如果foo < 0它返回错误。如果你真的想

((foo > 0) && (foo == myfoo)) || (foo <= 0)

那么这个方法就如写的那样工作。

关于java - 降低此方法的 boolean 表达式复杂度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25209026/

相关文章:

java - Selenium 出现 Java 错误 :"File path wcxChrome.crx needs to be absolute in key ..."

java - 动态更改 JTree 中特定节点的图标

python - 检测序列是否是Python中子序列的倍数

java - 经验丰富的 PHP Web 开发人员想要开始 Java Web 开发吗?

java cucumber.api.cli.main 命令行用法

Java:嵌套 Hashmap 的问题

python - 获取列表中项目的错误值?设计问题还是逻辑问题?

java - 二进制 SVM 中的错误分类

algorithm - 访问多个城市的 TSP 的变化

algorithm - paranthesized 字符串并行处理的有效性