4

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

4

5 回答 5

10

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

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

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

于 2011-11-11T03:10:09.333 回答
2

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

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

然后,您将其替换为:

return a || b || c;
于 2012-08-17T02:20:55.807 回答
1

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

编辑:这个 SO-post 是一个[ENUMS 的好例子]

于 2015-07-24T08:15:18.970 回答
0

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

于 2011-11-11T02:58:22.697 回答
0

如果这是强制性的——是的,尽管它是徒劳的——你通常可以通过引入基类来降低类圈复杂度,并将函数分配到基类中,直到每个类的圈复杂度都可以。

或者更简单:将 // NOPMD 添加到您的类中:

public class VeryComplexStuff { // NOPMD
    ...
于 2019-01-09T12:12:00.063 回答