问题标签 [cyclomatic-complexity]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6671 浏览

language-agnostic - 圈复杂度和基本圈复杂度有什么区别?

已经有一个关于什么是圈复杂度的问题?

但是,还有另一个术语称为 - 基本圈复杂度。

代码的这两个指标有什么区别和相似之处?他们的典型接受值是什么?此外,我了解到,为了理解代码,基本圈复杂度是一个更相关的指标。而从实现的角度来看,圈复杂度是最相关的。如果是这样,为什么?

0 投票
4 回答
4394 浏览

java - 如何计算项目的圈复杂度(不是类/函数)?

如何计算整个Java项目的圈复杂度?我对每种方法都有复杂性,但是如何将它们全部聚合成一个数字指标?有什么想法或现有方法吗?

我不是在寻找工具,而是在寻找算法。

简单平均几乎不起作用,因为有许多1复杂性方法,它们的复杂性并不低,但对代码库的重要性较低(在大多数情况下)。

0 投票
2 回答
3146 浏览

c# - 圈复杂度数为 31,这是从哪里来的?

我正在开发一个从 Excel 文件中提取数据的应用程序(我无权访问实际数据库),并且我编写了一个方法,该方法具有从 Excel 电子表格中提取数据的唯一功能,如下所示.

我已经运行了代码分析(我正在使用 Visual Studio 2012 并在 .NET 4.5 中开发)并且我有一个CA1502: Avoid excessive complexity(复制如下)。作为一名初级开发人员(我今年 17 岁),我尝试使用 MSDN 了解更多有关此内容的信息,但是,我对为什么我的圈复杂度为 33 感到有些困惑。

CA1502

避免过度复杂

'Extraction.ExtractSMData(List<Range>)'圈复杂度为 33。重写或重构方法以将复杂度降低到 25。

Core.Extraction.cs:104

我可以通过我的快速如果(condition ? if_true : if_false,这些叫什么?)看到它可能很糟糕,但我仍然只能将其视为 5。

更新

圈复杂度现在是 33...

如果我注释掉entity.IncidentNumber = Row.get_Range("K1").get_Value();复杂性变为 32。我认为get_Range()并且get_Value()每个人都是一个,但还好......

如果我注释掉entity.RepairedOnTime = Row.get_Range("W1").get_Value().ToString().ToLower() == "no" ? false : true;复杂度变成 28 ......

get_Range(), get_Value(), quick-if 是 3,做ToString()和数ToLower()

0 投票
3 回答
594 浏览

java - 如何降低 onClick() 方法中的圈复杂度

让我们想象一个简单的构造:

这是一段处理不同按钮点击的简单代码。但随着按钮数量的增加 -switch块的圈复杂度也随之增加。是否有另一种方法来表示此代码构造以降低onClick()方法的圈复杂度?提前致谢。

0 投票
1 回答
2463 浏览

unit-testing - 复合条件和短路的圈复杂性

我正在大学的软件质量保证课程中学习圈复杂性,当您在谓词语句或节点中有复合条件时,我很难理解它是如何工作的。我见过多种圈复杂度的定义,我在课堂上使用的主要定义是

因此,对于这样的程序图,我们的圈复杂度为 2:

圈复杂度为 2 的程序图

我还看到了给出的圈复杂度的定义

这也适用于上面给出的图表。但是,我们有谓词节点的复合条件。我们考虑为自动短路设置的语言和系统,在我看来,左下角的图表必须扩展到图表。如果是下面这样的情况,圈复杂度是否会变为 3,即使在真正的源代码中,我们可能只有一个 if 语句,还是仍然是 V(G) = 2?.

这很令人困惑,因为我看到的大多数圈复杂度的定义都在谈论谓词节点,而且据我所知,谓词可能包含多个短路条件。如果不是这种情况,那么短路行为似乎在提高性能的同时,在考虑时实际上会提高循环复杂度。如果给出源码,是不是所有的条件都要分解成自己的节点,比如左图,才能计算圈复杂度? 扩展程序图以显示短路行为

0 投票
3 回答
625 浏览

java - 计算方法复杂度的原理是什么?

Sonar Metrics 复杂性页面中,以下方法的复杂度为 5。

这是该工具计算复杂性的方式:

增加复杂性的关键字:if、for、while、case、catch、throw、return(这不是方法的最后一条语句)、&&、||、?

为什么case语句、if块和while块会增加方法的复杂性?这种方法复杂度的度量计算背后的直觉是什么?

0 投票
3 回答
5151 浏览

java - 具有多个退出点的代码段中的圈复杂度

我有这个验证密码的方法:

让我们关注圈复杂度数:它的价值是什么?

Metrics 1.3.6说是 7,但我真的找不到 7 条独立路径:我只找到 5 条!维基百科也帮不上什么忙——我想怎么用这个公式π - s + 2

我有 2 个if、1 个for和 3 个出口点,但我被卡住了:我必须计算入口点吗?我应该先计算两次,if因为它有两个条件吗?

编辑:

好的,现在我发现圈数是 7。这意味着有 7 个独立的路径,所以如果我想覆盖 100% 的代码,我应该能够找到 7 个不同的测试用例,对吗?

好吧,我仍然找不到最后一个!我发现了这些:

  1. 有效:asdf1234
  2. 太短:asdf123
  3. 太长:asdfsgihzasweruihioruldhgobaihgfuiosbhrbgtadfhsdrhuorhguozr
  4. 无效字符:asdf*123
  5. 全数字:12345678
  6. 无数字:asdfghjk
  7. 呜呜呜???
0 投票
1 回答
914 浏览

javascript - 逻辑相似代码的圈复杂度

考虑以下三个函数,它们都以相同的方式运行,使用不同的代码来实现相同的事情(示例是用 JavaScript 编写的,我对应用于 JavaScript 的答案特别感兴趣,但这个问题真的适用于任何具有相似结构的语言):

JSComplexity工具报告所有三个函数的复杂度为 4,这意味着运算||符被视为独立分支,贯穿case语句也是如此。JSHint 似乎并不关心||操作符,但它确实case以相同的方式处理失败语句。似乎让条件运算符完全错误。

在计算圈复杂度时,是否应将贯穿case语句和逻辑“或”运算符视为独立分支?那么三元条件呢(我相信这更简单,JSHint 在这种情况下显然是错误的)?上述所有三个函数都应该具有相同的圈复杂度吗?

0 投票
1 回答
309 浏览

architecture - 外观/服务架构

在我提出问题之前,我必须描述一下我们的应用程序是如何构建的。

我们在服务层运行了几个使用 ejb 的 Web 应用程序。我尝试用一​​个简短的例子来描述沟通:

  • 一个 JSF bean (PersonH​​andler) 调用一个外观来删除一个“Person”对象
  • 一个门面可以使用许多不同的服务,但不能使用其他门面。在这种情况下,PersonFacade 使用 PersonService(删除人员)和 NotificationService(发送电子邮件)。事务也由外观逻辑控制。仅当事务成功提交时才应发送电子邮件。
  • 服务不能引用另一个服务或外观。而不是这个,PersonService 只有一个对 PersonDao 的引用(持久逻辑)。

我认为这种架构很常见。这是我的问题。

在 PersonFacade 的 delete 方法中,我们有非常重要的代码,我们不会重复。每次应该删除一个人时,这段代码都应该运行。在另一个门面逻辑中,我们需要完全相同的代码,但门面 <--> 门面通信是不允许的。

这个问题的最佳解决方案是什么?

这是我目前的解决方案,但我对此不满意。我创建了一个带有处理删除逻辑的 ejb 的新 ejb 模块。两个外观模块都依赖于新模块,因此一切正常,我不会违反“外观从不使用其他外观”的合同。如果我们每次在不同的地方需要相同的代码时都使用它,我们的模块将会爆炸并且模块会变得混乱。目前我们有超过 250 个 ejb/jar 模块。

0 投票
1 回答
430 浏览

math - 圈复杂度(Vg) - 最小或最小独立路径的最小数量?

我认为 Vg = 独立路径的最小数量,但今天我看到我的一位老师的演示,它说:Vg 等于或大于独立路径的数量。是真的?我确信在计算 cyclomatix 复杂度时,它始终是独立路径的最小可能数量。