问题标签 [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.
language-agnostic - 圈复杂度和基本圈复杂度有什么区别?
已经有一个关于什么是圈复杂度的问题?
但是,还有另一个术语称为 - 基本圈复杂度。
代码的这两个指标有什么区别和相似之处?他们的典型接受值是什么?此外,我了解到,为了理解代码,基本圈复杂度是一个更相关的指标。而从实现的角度来看,圈复杂度是最相关的。如果是这样,为什么?
java - 如何计算项目的圈复杂度(不是类/函数)?
如何计算整个Java项目的圈复杂度?我对每种方法都有复杂性,但是如何将它们全部聚合成一个数字指标?有什么想法或现有方法吗?
我不是在寻找工具,而是在寻找算法。
简单平均几乎不起作用,因为有许多1
复杂性方法,它们的复杂性并不低,但对代码库的重要性较低(在大多数情况下)。
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()
?
java - 如何降低 onClick() 方法中的圈复杂度
让我们想象一个简单的构造:
这是一段处理不同按钮点击的简单代码。但随着按钮数量的增加 -switch
块的圈复杂度也随之增加。是否有另一种方法来表示此代码构造以降低onClick()
方法的圈复杂度?提前致谢。
unit-testing - 复合条件和短路的圈复杂性
我正在大学的软件质量保证课程中学习圈复杂性,当您在谓词语句或节点中有复合条件时,我很难理解它是如何工作的。我见过多种圈复杂度的定义,我在课堂上使用的主要定义是
因此,对于这样的程序图,我们的圈复杂度为 2:
我还看到了给出的圈复杂度的定义
这也适用于上面给出的图表。但是,我们有谓词节点的复合条件。我们考虑为自动短路设置的语言和系统,在我看来,左下角的图表必须扩展到图表。如果是下面这样的情况,圈复杂度是否会变为 3,即使在真正的源代码中,我们可能只有一个 if 语句,还是仍然是 V(G) = 2?.
这很令人困惑,因为我看到的大多数圈复杂度的定义都在谈论谓词节点,而且据我所知,谓词可能包含多个短路条件。如果不是这种情况,那么短路行为似乎在提高性能的同时,在考虑时实际上会提高循环复杂度。如果给出源码,是不是所有的条件都要分解成自己的节点,比如左图,才能计算圈复杂度?
java - 计算方法复杂度的原理是什么?
在Sonar Metrics 复杂性页面中,以下方法的复杂度为 5。
这是该工具计算复杂性的方式:
增加复杂性的关键字:if、for、while、case、catch、throw、return(这不是方法的最后一条语句)、&&、||、?
为什么case语句、if块和while块会增加方法的复杂性?这种方法复杂度的度量计算背后的直觉是什么?
java - 具有多个退出点的代码段中的圈复杂度
我有这个验证密码的方法:
让我们关注圈复杂度数:它的价值是什么?
Metrics 1.3.6说是 7,但我真的找不到 7 条独立路径:我只找到 5 条!维基百科也帮不上什么忙——我想怎么用这个公式π - s + 2
?
我有 2 个if
、1 个for
和 3 个出口点,但我被卡住了:我必须计算入口点吗?我应该先计算两次,if
因为它有两个条件吗?
编辑:
好的,现在我发现圈数是 7。这意味着有 7 个独立的路径,所以如果我想覆盖 100% 的代码,我应该能够找到 7 个不同的测试用例,对吗?
好吧,我仍然找不到最后一个!我发现了这些:
- 有效:asdf1234
- 太短:asdf123
- 太长:asdfsgihzasweruihioruldhgobaihgfuiosbhrbgtadfhsdrhuorhguozr
- 无效字符:asdf*123
- 全数字:12345678
- 无数字:asdfghjk
- 呜呜呜???
javascript - 逻辑相似代码的圈复杂度
考虑以下三个函数,它们都以相同的方式运行,使用不同的代码来实现相同的事情(示例是用 JavaScript 编写的,我对应用于 JavaScript 的答案特别感兴趣,但这个问题真的适用于任何具有相似结构的语言):
JSComplexity工具报告所有三个函数的复杂度为 4,这意味着运算||
符被视为独立分支,贯穿case
语句也是如此。JSHint 似乎并不关心||
操作符,但它确实case
以相同的方式处理失败语句。似乎让条件运算符完全错误。
在计算圈复杂度时,是否应将贯穿case
语句和逻辑“或”运算符视为独立分支?那么三元条件呢(我相信这更简单,JSHint 在这种情况下显然是错误的)?上述所有三个函数都应该具有相同的圈复杂度吗?
architecture - 外观/服务架构
在我提出问题之前,我必须描述一下我们的应用程序是如何构建的。
我们在服务层运行了几个使用 ejb 的 Web 应用程序。我尝试用一个简短的例子来描述沟通:
- 一个 JSF bean (PersonHandler) 调用一个外观来删除一个“Person”对象
- 一个门面可以使用许多不同的服务,但不能使用其他门面。在这种情况下,PersonFacade 使用 PersonService(删除人员)和 NotificationService(发送电子邮件)。事务也由外观逻辑控制。仅当事务成功提交时才应发送电子邮件。
- 服务不能引用另一个服务或外观。而不是这个,PersonService 只有一个对 PersonDao 的引用(持久逻辑)。
我认为这种架构很常见。这是我的问题。
在 PersonFacade 的 delete 方法中,我们有非常重要的代码,我们不会重复。每次应该删除一个人时,这段代码都应该运行。在另一个门面逻辑中,我们需要完全相同的代码,但门面 <--> 门面通信是不允许的。
这个问题的最佳解决方案是什么?
这是我目前的解决方案,但我对此不满意。我创建了一个带有处理删除逻辑的 ejb 的新 ejb 模块。两个外观模块都依赖于新模块,因此一切正常,我不会违反“外观从不使用其他外观”的合同。如果我们每次在不同的地方需要相同的代码时都使用它,我们的模块将会爆炸并且模块会变得混乱。目前我们有超过 250 个 ejb/jar 模块。
math - 圈复杂度(Vg) - 最小或最小独立路径的最小数量?
我认为 Vg = 独立路径的最小数量,但今天我看到我的一位老师的演示,它说:Vg 等于或大于独立路径的数量。是真的?我确信在计算 cyclomatix 复杂度时,它始终是独立路径的最小可能数量。