是否有考虑 Java 流和反应式 API 的圈复杂度计算器?

Nod*_*s2k 5 java static-analysis cyclomatic-complexity reactive-programming java-stream

在一个使用 spring reactor 的项目中,我们检测到我们的静态分析工具没有检测到反应代码的真正复杂性。目前我们正在使用 PMD、Checkstyle、Spotbugs 和 SonarQube 的组合,但它们都无法检测“复杂的反应代码”。

有没有其他工具可以考虑到 Java 中新的响应式 API 和流 API?

一些被认为具有圈复杂度 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);

Run Code Online (Sandbox Code Playgroud)

在这三种情况下,“经典等效”代码具有更高的复杂度值,因此我们担心代码的实际复杂度被新语法隐藏了。这意味着我们对代码可维护性的估计是错误的,并且会随着时间的推移而恶化。