Java код PMD жалуется на цикломатическую сложность, из 20 - PullRequest
2 голосов
/ 11 ноября 2011

Когда я запустил PMD на своем Java-коде, одно из сообщений об ошибке, которое он показывает, - «Класс 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, и если это так, то причина, по которой циклокомплексность возросла, расскажите, пожалуйста,мне, что выполнимый подход согласно стандарту для этого ??

Ответы [ 5 ]

8 голосов
/ 11 ноября 2011

Измерения цикломатической сложности следует использовать не для контроля качества, а в качестве индикатора / предупреждения о плохом коде.Вы должны сосредоточиться больше на коде, стоящем за ним, а не на значении самого CC.

Хотя вы можете уменьшить сложность метода validate, разделив его на более мелкие методы посредством рефакторинга, класса в целомбудет по-прежнему иметь тот же CC.

Пока код читаемый и имеет смысл для следующего человека, который должен смотреть на него, тогда более высокий CC не должен иметь значениямного.

1 голос
/ 24 июля 2015

Просто хотел добавить, что иногда такие проблемы можно решить с помощью построения объектов или структур. Вы можете объявить «класс Wrapper» для ваших данных, которые должны быть возвращены. Но всегда есть случаи, когда вы не можете применить это без раздувания кода с тоннами объектов, что в свою очередь также приводит к нечитаемому коду ^^ "

РЕДАКТИРОВАТЬ : этот SO-пост [хороший пример с ENUMS]

1 голос
/ 17 августа 2012

Помогает, если у вас есть что-то вроде этого:

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

, тогда вы замените его следующим:

return a || b || c;
0 голосов
/ 09 января 2019

Если это обязательно - да, это происходит, несмотря на то, что это бесполезно - вы часто можете уменьшить цикломатическую сложность классов, вводя базовые классы и перемещая функции распределения в базовые классы, пока цикломатическая сложность для класса не будет в порядке.

Или проще: добавьте // NOPMD в ваш класс:

public class VeryComplexStuff { // NOPMD
    ...
0 голосов
/ 11 ноября 2011

Цикломатическая сложность, кажется, указывает на количество путей кода, которые существуют.Поэтому, если в ваших требованиях указано, что вы должны использовать много символов if и if, то вы можете игнорировать это сообщение.

...