我正处于圈复杂度(CC)的学习阶段.对于练习,我正在计算2个例子的圈复杂度,并想确认我的答案是否正确......
参考维基百科,CC由以下地址给出M = E ? N + 2P:
请帮忙.

这里,E = 8,N = 9,P = 1.因此,M = 8-9 +(2×1)= 1.
例2:

这里E = 11,N = 10且P = 1.因此M = 10-11 +(2×1)= 1.
因此,对于两个例子,CC都是1.如果我的计算是正确的,请告诉我.
人们可以建议使用C#winforms代码库来确定循环复杂性的最佳工具.
最近,我们公司已开始每周测量代码中的功能的圈复杂度(CC),并报告哪些功能已经改善或恶化.所以我们开始更多地关注功能的CC.
我已经读过CC可以非正式地计算为1 +函数中的决策点数(例如if语句,for循环,select等),或者通过函数的路径数...
我知道减少CC的最简单方法是重复使用Extract Method重构...
有些事情我不确定,例如以下代码片段的CC是什么?
1)
for (int i = 0; i < 3; i++)
Console.WriteLine("Hello");
Run Code Online (Sandbox Code Playgroud)
和
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Run Code Online (Sandbox Code Playgroud)
它们都做同样的事情,但是由于for语句,第一个版本是否有更高的CC?
2)
if (condition1)
if (condition2)
if (condition 3)
Console.WriteLine("wibble");
Run Code Online (Sandbox Code Playgroud)
和
if (condition1 && condition2 && condition3)
Console.WriteLine("wibble");
Run Code Online (Sandbox Code Playgroud)
假设语言进行了短路评估,例如C#,那么这两个代码片段具有相同的效果......但是第一个片段的CC是否更高,因为它有3个决策点/ if语句?
3)
if (condition1)
{
Console.WriteLine("one");
if (condition2)
Console.WriteLine("one and two");
}
Run Code Online (Sandbox Code Playgroud)
和
if (condition3)
Console.WriteLine("fizz");
if (condition4)
Console.WriteLine("buzz");
Run Code Online (Sandbox Code Playgroud)
这两个代码片段做了不同的事情,但它们是否有相同的CC?或者第一个片段中的嵌套if语句是否具有更高的CC?即嵌套if语句在精神上更难理解,但是在CC中反映出来了吗?
我有一个接收Object的方法,并根据它检测到的对象类型做一些事情:
void receive(Object object) {
if (object instanceof ObjectTypeA) {
doSomethingA();
}
else {
if (object instanceof ObjectTypeB) {
doSomethingB();
}
else {
if (object instanceof ObjectTypeC) {
doSomethingC();
}
else {
if (object instanceof ObjectTypeD) {
doSomethingD();
}
else {
// etc...
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何降低Cyclomatic Complexity?我四处搜索但找不到任何有用的东西.
Cyclomatic复杂度测量可以通过函数获取多少个可能的分支.是否有现有的函数/工具来计算R函数?如果没有,建议是最好的方式来写一个.
朝着这个一个廉价的启动将是计数的所有出现次数if,ifelse或者switch你的函数中.要获得真正的答案,您需要了解分支何时开始和结束,这要困难得多.也许一些R解析工具会让我们开始?
每当我拿出一段我正在处理的代码时,我就得到了This function's cyclomatic complexity is too high. (7).但我对如何以这种方式重写它有点困惑,所以它的工作原理.
这将是不断抛出该消息的函数:
function () {
var duration = +new Date() - start.time,
isPastHalf = Number(duration) < 250 && Math.abs(delta.x) > 20 || Math.abs(delta.x) > viewport / 2,
direction = delta.x < 0;
if (!isScrolling) {
if (isPastHalf) {
if (direction) {
this.close();
} else {
if (this.content.getBoundingClientRect().left > viewport / 2 && pulled === true) {
this.close();
return;
}
this.open();
}
} else {
if (this.content.getBoundingClientRect().left > viewport / 2) { …Run Code Online (Sandbox Code Playgroud) 我正在使用JSHint,我想关闭圈复杂度.
我怎样才能做到这一点?
对于具有大量决策语句(包括if/while/for语句)的方法,Cyclomatic Complexity会很高.那么我们如何改进呢?
我正在处理一个大型项目,我应该为CC> 10的方法减少CC.并且有很多方法可以解决这个问题.下面我将列出一些代码模式(而不是实际代码)与我遇到的问题.是否有可能简化它们?
导致许多决策陈述的案例示例:
情况1)
if(objectA != null) //objectA is a pass in as a parameter
{
objectB = doThisMethod();
if(objectB != null)
{
objectC = doThatMethod();
if(objectC != null)
{
doXXX();
}
else{
doYYY();
}
}
else
{
doZZZ();
}
}
Run Code Online (Sandbox Code Playgroud)
案例2)
if(a < min)
min = a;
if(a < max)
max = a;
if(b > 0)
doXXX();
if(c > 0)
{
doYYY();
}
else
{
doZZZ();
if(c > d)
isTrue = false;
for(int i=0; i<d; i++)
s[i] …Run Code Online (Sandbox Code Playgroud) 我希望能够展示代码库的可视化,它可以显示过于复杂和交织的区域.
我知道clang是什么,但我不确定它在这种情况下能给我什么.
c# ×2
javascript ×2
jshint ×2
refactoring ×2
clang ×1
instanceof ×1
java ×1
metrics ×1
node.js ×1
objective-c ×1
r ×1