当前位置: 首页 > 知识库问答 >
问题:

降低这种方法的布尔表达式复杂度?

莫骞仕
2023-03-14

这个isValid()方法最多有6个属性可以设置以便进行验证。如果没有设置特定属性,则不需要对其进行验证。逻辑似乎是工作的方式,我希望它的工作。如何降低此方法的布尔表达式复杂性?

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());
}
}

共有1个答案

彭展
2023-03-14

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

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

(X!=null&&X==value)X==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 == myfoo)) || (foo <= 0)
 类似资料:
  • 如何降低给定代码段的复杂性?我在Sonarqube中得到了这个错误-->重构这个方法,将其认知复杂度从21降低到允许的15。

  • 我得到声纳警告来降低它的复杂性。我如何重构下面的代码,将其认知复杂度从18降低到允许的15?

  • 我有一段认知复杂度为21的代码 我知道这可能是个人观点,但我正在寻找真正的解决方案或答案,从那些以前有过类似情况的人那里。 编辑:我无法从我正在工作的开发机器上访问许多库和包。我可以访问一些(太多了,无法列出),所以请注意这一点,然后建议使用一个。

  • 问题内容: 我正在研究将RequestDTO发送到Web服务的类。我需要先验证请求,然后再发送。 可以从3个不同的地方发送请求,每个“ requesttype”都有不同的验证规则,例如request1必须具有名称和电话号码,request2必须具有地址,等等) 我有一个DTO,其中包含很长的字段列表(名称,地址,城市,电话号码等),无论请求是哪种类型,DTO都发送相同的消息。 我创建了3种不同的验

  • 我在重构这部分代码时遇到了问题。如何降低该代码的认知复杂性

  • 问题内容: 我有一个接收对象并根据其检测到的对象类型执行某些操作的方法: 如何降低环复杂性?我四处搜寻,但找不到任何有用的资讯。 问题答案: 您不能为此使用面向对象的方法吗?创建具有该方法的接口,然后创建实现所需行为的子类?然后调用将执行适当的行为?