Существует ли какой-либо калькулятор сложности цикломати c, который учитывает Java потоковый и реактивный API? - PullRequest
5 голосов
/ 09 января 2020

В проекте с использованием пружинного реактора мы обнаружили, что реальная сложность реактивного кода не определяется нашими инструментами анализа stati c. В настоящее время мы используем комбинацию PMD, Checkstyle, Spotbugs и SonarQube, но ни один из них не способен обнаружить «сложный реактивный код».

Существует ли какой-либо другой инструмент, который может учитывать новые реактивные и потоковые API в Java?

Только некоторые очень простые примеры, которые, как считается, имеют цикломатику c сложность 0, могут быть:

  // EXAMPLE 1: Optional usage for avoiding null field checks
  int activeSensors = Optional.of(sensorData).map(SensorData::getActiveCount).orElse(0);

  // EXAMPLE 2: Stream API usage for replacing iterations and conditionals
  list.stream().filter(Objects::nonNull).forEach(item -> do_something(item));

  // EXAMPLE 3: Reactive API
  Flux<Float> historyValuesFlux = Mono.justOrEmpty(sensorData)
      .filter(Objects::nonNull)
      .flatMapMany(data -> Flux.fromIterable(data.getHistoryPoints()))
      .filter(Objects::nonNull)
      .map(SensorHistoryPoint::getValue);

В трех случаях Код «classi c эквивалентный» имеет более высокое значение сложности, поэтому мы обеспокоены тем, что фактическая сложность кода скрыта новым синтаксисом. А это значит, что наши оценки работоспособности кода неверны и со временем ухудшатся.

...