问题标签 [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 投票
8 回答
41312 浏览

python - 如何分析 Python 代码以识别有问题的区域?

我有一个跨多个项目的大型源存储库。我想生成一份关于源代码健康状况的报告,确定需要解决的问题区域。

具体来说,我想调用具有高圈复杂度的例程,识别重复,并可能运行一些类似于 lint 的静态分析来发现可疑(因此可能是错误的)构造。

我该如何构建这样的报告?

0 投票
7 回答
27619 浏览

javascript - 计算 Javascript 的圈复杂度

是否有任何工具可用于计算 Javascript 中的圈复杂度?

过去在处理服务器端代码时,我发现它是一个非常有用的指标,并且希望能够将它用于我编写的客户端 Javascript。

0 投票
12 回答
24669 浏览

language-agnostic - 具有最小圈复杂度的条件日志记录

阅读“你的/一个好的圈复杂度限制是多少? ”后,我意识到我的许多同事对我们项目的这个新的QA政策感到非常恼火:每个函数不再有 10 个圈复杂度。

含义:不超过10个'if'、'else'、'try'、'catch'等代码工作流分支语句。对。正如我在'你测试私有方法吗?',这样的政策有很多好的副作用。

但是:在我们(200 人 - 7 年之久)项目开始时,我们很高兴记录日志(不,我们不能轻易将其委托给某种“面向方面编程”的日志方法)。

当我们的系统的第一个版本上线时,我们遇到了巨大的内存问题,不是因为日志记录(曾经关闭过),而是因为日志参数(字符串),它们总是被计算出来,然后传递给'info()' 或 'fine()' 函数,却发现日志记录的级别是 'OFF',并且没有发生日志记录!

所以 QA 回来并敦促我们的程序员进行条件日志记录。总是。

但是现在,由于每个函数限制的“不能移动”10 个圈复杂度级别,他们认为他们放入函数中的各种日志被认为是一种负担,因为每个“if(isLoggable())”都是算作+1圈复杂度!

因此,如果一个函数具有 8 个“if”、“else”等,在一个紧密耦合的不易共享算法中,以及 3 个关键日志操作......即使条件日志可能不是真的,它们也会超出限制该功能的所述复杂性的一部分......

您将如何解决这种情况?
我在我的项目中看到了一些有趣的编码演变(由于那个“冲突”),但我只想先得到你的想法。


谢谢你的所有答案。
我必须坚持认为问题与“格式”无关,而是与“参数评估”相关(在调用一个什么都不做的方法之前进行评估可能非常昂贵)
所以当一个在“A String”上面写的时候,我实际上意味着 aFunction(),aFunction() 返回一个字符串,并调用一个复杂的方法来收集和计算要由记录器显示的所有类型的日志数据......使用条件日志,因此人为增加“圈复杂度”的实际问题......)

我现在得到了你们中的一些人提出的“可变参数函数”点(谢谢约翰)。
注意:java6 中的快速测试表明,我的varargs 函数在被调用之前确实评估了它的参数,因此它不能应用于函数调用,而是用于“日志检索器对象”(或“函数包装器”),其中 toString( ) 只会在需要时调用。知道了。

我现在已经发布了我在这个主题上的经验。
我会把它留在那里直到下周二投票,然后我会选择你的答案之一。
再次感谢您的所有建议:)

0 投票
8 回答
4008 浏览

language-agnostic - 寻求有关结构化代码以降低圈复杂度的说明

最近我们公司开始每周测量我们代码中函数的圈复杂度(CC),并报告哪些函数得到了改进或恶化。所以我们开始更加关注函数的CC。

我读过 CC 可以非正式地计算为 1 + 函数中的决策点数(例如 if 语句、for 循环、选择等),或者通过函数的路径数......

我知道减少CC的最简单方法是重复使用Extract Method重构......

有些事情我不确定,例如以下代码片段的 CC 是什么?

1)

他们都做同样的事情,但是第一个版本是否因为 for 语句而具有更高的 CC 呢?

2)

假设该语言进行短路评估,例如 C#,那么这两个代码片段具有相同的效果......但是第一个片段的 CC 是否更高,因为它有 3 个决策点/if 语句?

3)

这两个代码片段做了不同的事情,但是他们有相同的CC吗?还是第一个片段中的嵌套 if 语句有更高的 CC?即嵌套的 if 语句在心理上更难理解,但这反映在 CC 中吗?

0 投票
5 回答
5562 浏览

code-metrics - 验证数据时降低圈复杂度的最佳方法是什么?

现在,我正在开发一个 Web 应用程序,该应用程序从可能返回空结果的数据库中接收大量数据。当通过应用程序的圈复杂度时,许多函数的权重在 10 到 30 之间。在大多数情况下,大多数具有高数字的函数都有很多类似于以下的行:

这引出了我的问题,尝试降低这些数字的最佳方法是什么?现在,我正在考虑将大多数功能置于 10 以下。

0 投票
28 回答
9511 浏览

algorithm - 代码应该有多复杂?

我正在研究可以帮助我编写更小但更复杂的代码的算法。与其编写 150 行 if-else 语句,我可以设计一个算法,用 20 行来完成。问题是很多这些算法可能很复杂,需要大量的数学才能理解它们。我也是这里唯一了解他们的人。

为了代码的可维护性,像其他人一样编写代码会更好,还是使用算法更好?

0 投票
4 回答
2232 浏览

language-agnostic - 什么是(或应该是)虚函数调用的圈复杂度?

圈复杂度为理解给定函数的难易程度或包含错误的潜力提供了一个粗略的衡量标准。在我读过的实现中,通常所有基本的控制流构造(if、case、while、for 等)都会将函数的复杂度增加 1。在我看来,圈复杂度旨在确定“通过程序源代码的线性独立路径的数量”虚拟函数调用也应该增加函数的圈复杂度,因为在运行时将调用哪个实现的模糊性(调用在路径中创建另一个分支执行)。

但是,如果函数包含等效的 switch 语句(每个“case”关键字一个点,实现相关虚函数的层次结构中的每个类一个 case 关键字),对函数进行相同的惩罚,感觉过于苛刻,因为虚函数调用通常被认为是更好的编程实践。

虚函数调用的圈复杂度成本应该是多少?我不确定我的推理是反对将圈复杂度作为度量的效用,还是反对使用虚函数或不同的东西。

编辑:在人们的回应之后,我意识到它不应该增加圈复杂性,因为我们可以认为虚函数调用等同于对包含大量 switch 语句的全局函数的调用。即使该函数会得到一个坏分数,它在程序中只存在一次,而直接用 switch 语句替换每个虚拟函数调用会导致多次成本。

0 投票
3 回答
2193 浏览

linq - LINQ 和 Lambda 表达式是否会降低圈复杂度?

LINQ 和 Lambda 表达式是否会降低圈复杂度?只是好奇,因为当 VS 分析器增加 cc 时,CodeRush 实际上显示 cc 减少。

0 投票
5 回答
17675 浏览

c# - 为 .NET 和 Java 自动生成单元测试用例

给定一个 .NET 或 Java 项目,是否有一个好的工具来生成单元测试用例,它生成的单元测试用例将覆盖几乎 100% 的代码覆盖率。测试用例的数量可能与代码的圈复杂度成正比(循环和条件的嵌套越高圈复杂度越高),圈复杂度越高,生成的测试用例集就越多。我不希望它功能齐全(比如我将构建单元测试并在生成后运行它),但我会说它可以在您要修改的测试用例中具有模板样式适合您预期需求的案例。但它也应该有一个适当的设置和拆卸方法,并且足以检测是否应该使用模拟对象进行单元测试,如果有任何依赖关系。那么,存在这样的工具吗?

0 投票
4 回答
1557 浏览

.net - 在 .NET 中导出圈复杂度

我知道我可以通过右键单击并选择“计算代码度量”来访问我在 Visual Studio 2008 团队资源管理器中的代码的圈复杂度。我想公开这些数据以供 Web 应用程序显示。有人知道通过 API 访问这些数据的任何方式吗?

谢谢你的帮助!