Java代码PMD抱怨Cyclomatic Complexity,20

问题描述 投票:2回答:5

当我在我的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代码对代码进行编码,如果是其他因此循环复杂性增加的原因,请告诉我什么是可行的方法按照标准?

java performance pmd
5个回答
8
投票

Cyclomatic Complexity测量不应用于质量控制,而应用作坏代码的指示/警告。您应该更多地关注它背后的代码,而不是CC本身的价值。

虽然你可以通过重构将validate方法分解为更小的方法来降低if (a) { return true; } else if (b) { return true; } else if (c) { return true; } else { return false; } 方法的复杂性,但是整个类仍然具有相同的CC。

只要代码是可读的并且对于必须查看它的下一个人有意义,那么拥有更高的CC应该不会那么重要。


1
投票

如果您有这样的事情会有所帮助:

return a || b || c;

然后,你用这个替换它:

[nice example with ENUMS]

1
投票

只是想补充一点,有时可以通过对象或结构构建来解决这些问题。您可以为应该返回的数据声明一个“Wrapper-Class”。但是总有一些情况下你不能在不使用大量对象膨胀代码的情况下应用它,这反过来也导致代码不可读^^“

编辑:这个SO帖子是public class VeryComplexStuff { // NOPMD ...


0
投票

循环复杂性似乎表明存在的代码路径的数量。因此,如果您的要求说您必须使用许多ifs和elses,那么您可以忽略该消息。


0
投票

如果这是强制性的 - 是的,尽管它已经发生了 - 这通常会通过引入基类来减少类的圈复杂度,并将函数移动到基类中,直到每个类的圈复杂度都可以。

或者更简单:将// NOPMD添加到您的班级:

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.