В проекте с использованием пружинного реактора мы обнаружили, что реальная сложность реактивного кода не определяется нашими инструментами анализа 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 эквивалентный» имеет более высокое значение сложности, поэтому мы обеспокоены тем, что фактическая сложность кода скрыта новым синтаксисом. А это значит, что наши оценки работоспособности кода неверны и со временем ухудшатся.