这个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());
}
}
我首先给每个子表达式指定有意义的名称,然后将结果分配给变量,然后在变量之间进行&&检查。这将大大增加可读性。
而且你的条件似乎都有形式
(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种不同的验
我在重构这部分代码时遇到了问题。如何降低该代码的认知复杂性
问题内容: 我有一个接收对象并根据其检测到的对象类型执行某些操作的方法: 如何降低环复杂性?我四处搜寻,但找不到任何有用的资讯。 问题答案: 您不能为此使用面向对象的方法吗?创建具有该方法的接口,然后创建实现所需行为的子类?然后调用将执行适当的行为?