Java代码PMD抱怨Cyclomatic Complexity,20

时间:2011-11-11 02:53:56

标签: 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.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 
    }
  }
}

正如您所看到的,根据我的业务需求,我需要对类进行编码 如果有这么多,如果是其他原因,那么环形复杂性增加了,请告诉我 什么是可行的方法,按照这个标准?

5 个答案:

答案 0 :(得分:8)

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

虽然您可以通过重构将其分解为更小的方法来降低validate方法的复杂性,但整个类仍将具有相同的CC。

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

答案 1 :(得分:1)

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

if (a) {
   return true;
} else if (b) {
   return true;
} else if (c) {
   return true;
} else {
   return false;
}

然后,你用它替换它:

return a || b || c;

答案 2 :(得分:1)

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

编辑:此SO帖子为[nice example with ENUMS]

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果这是强制性的-是的,尽管它很简单-还是会发生的-您通常可以通过引入基类来降低类循环复杂性,并将功能分配到基类中,直到每个类的循环复杂性都可以。

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

public class VeryComplexStuff { // NOPMD
    ...