Java代码PMD抱怨圈复杂度为20

Java代码PMD抱怨圈复杂度为20,java,performance,pmd,Java,Performance,Pmd,当我在Java代码上运行PMD时,它显示的一条错误消息是 “STWeb类的圈复杂度为20”。 我的java类通常是这样的 public class STWeb implements STWebService { public String getData(RequestData request) { validate(request); } public boolean validate(Data[] formdata) { if(formdata.len

当我在Java代码上运行PMD时,它显示的一条错误消息是 “STWeb类的圈复杂度为20”。 我的java类通常是这样的

public class STWeb implements STWebService {

  public String getData(RequestData request)
  {
    validate(request);
  }

  public boolean validate(Data[] formdata)
  {
    if(formdata.length==1)
    //do this 
    else if(formdata.length==3)
    //do this 
    else if(formdata.length==4)
    //do this 
    else if(formdata.length>4)
    //do this 
    else if(formdata.length==2)
    {
      if(formdata[0].getName.equals("OIY"))
      {
      }
    / And many more if else here 
    }
  }
}
如您所见,根据我的业务需求,我需要对类进行编码 由于有很多if和if-else,循环复杂性增加的原因,请告诉我
根据该标准,什么是可行的方法???

圈复杂度似乎表明存在的代码路径的数量。因此,如果您的需求表明您必须使用许多ifs和if ELSE,那么您可以忽略该消息。

圈复杂度度量不应用于质量控制,而应作为错误代码的指示器/警告。您应该更多地关注它背后的代码,而不是CC本身的价值

尽管可以通过重构将
validate
方法拆分为更小的方法来降低其复杂性,但类作为一个整体仍然具有相同的CC


只要代码是可读的,并且对下一个必须查看它的人来说是有意义的,那么拥有一个更高的CC就不那么重要了

如果你有这样的东西,它会很有帮助:

if (a) {
   return true;
} else if (b) {
   return true;
} else if (c) {
   return true;
} else {
   return false;
}
然后,将其替换为以下内容:

return a || b || c;

我只是想补充一点,有时候用对象或结构建筑来解决这些问题是可能的。您可以为应该返回的数据声明一个“包装类”。但是,在某些情况下,如果不使用大量对象使代码膨胀,就无法应用此功能,这反过来也会导致无法读取的代码^”


编辑:如果这是强制性的,那么这篇文章就是一篇

如果这是强制性的-是的,尽管这是徒劳的,但还是会发生这种情况-您通常可以通过引入基类来降低类圈复杂度,并将函数分发到基类中,直到每类圈复杂度正常为止

或更简单:将//NOPMD添加到类:

public class VeryComplexStuff { // NOPMD
    ...

试着缩进你的代码,这样我们就可以看到发生了什么