Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有考虑Java流和反应式API的圈复杂度计算器?_Java_Java Stream_Reactive Programming_Static Analysis_Cyclomatic Complexity - Fatal编程技术网

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

有没有考虑Java流和反应式API的圈复杂度计算器?,java,java-stream,reactive-programming,static-analysis,cyclomatic-complexity,Java,Java Stream,Reactive Programming,Static Analysis,Cyclomatic Complexity,在一个使用springreactor的项目中,我们发现静态分析工具无法检测到反应式代码的真正复杂性。目前,我们正在使用PMD、Checkstyle、Spotbug和SonarQube的组合,但它们都无法检测“复杂的反应性代码” 有没有其他工具可以考虑Java中新的反应式和流式API 仅一些被认为具有圈复杂度0的非常简单的示例可以是: //示例1:避免空字段检查的可选用法 int activeSensors=Optional.of(sensorData).map(sensorData::getAc

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

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

仅一些被认为具有圈复杂度0的非常简单的示例可以是:

//示例1:避免空字段检查的可选用法
int activeSensors=Optional.of(sensorData).map(sensorData::getActiveCount).orElse(0);
//示例2:替换迭代和条件的流API用法
list.stream().filter(Objects::nonNull).forEach(item->do_something(item));
//示例3:反应式API
通量历史值通量=Mono.justOrEmpty(传感器数据)
.filter(对象::非空)
.flatMapMany(数据->通量.fromIterable(data.getHistoryPoints()))
.filter(对象::非空)
.map(SensorHistoryPoint::getValue);

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

我认为,事实上,该代码比“经典”代码要简单得多。以经典的方式创建这个函数会导致for循环和ifs的混乱,但这很容易理解。@SebastianLenartowicz,这无助于度量复杂性。在任何情况下,我都尝试过用经典风格重写这些示例,它们更容易理解。如果不使用空值,它们会更容易理解。流样式很少有什么优势,而reactive似乎是关于将状态从堆栈移动到堆(就我所能理解的而言,光纤看起来可能会在将来变得毫无意义)因此,计算流/反应库的使用情况是衡量这种偶然复杂性的一个好方法。@TomHawtin tackline这是一个很好的指标,表明圈复杂度与可读性或可理解性不同。除了可读性,还有其他方面会受到代码复杂度的影响,由于测试工作的要求和存在缺陷的风险。对我们来说,这两点是控制代码复杂性的主要原因。然而,我们在这里进入了主观领域。毕竟,代码复杂度的相关性对每个人都不一样。圈复杂度是源代码的度量,而不是调用的方法在幕后可能做什么。是的,这意味着将源代码分解成更小的单元,隐藏复杂性是解决高复杂性问题的一种方法。因此,
list.forEach(System.out::println)
的复杂度低于(Object o:list)System.out.println(o)。不要混淆计算复杂性或“此代码实际做了什么”,因为当您重构代码以使其更易于维护时,您不会更改代码的用途,即在我的示例中,线性迭代是不可避免的。