【发布时间】:2021-06-07 14:13:09
【问题描述】:
我目前正在为我的 c# 类做一个项目。我们的老师给了我们一些必须遵守的代码度量限制,其中之一就是圈复杂度。现在他下面的方法的复杂度是5,但它必须是4。有什么办法可以改进吗?
方法我说的是:
private bool MethodName()
{
int counter = 0;
for (int k = 0; k < 8; k++)
{
for (int j = 0; j < 3; j++)
{
if (class1.GetBoard()[array1[k, j, 0], array1[k, j, 1]] == player.WhichPlayer()) counter++;
}
if (counter == 3) return true;
else counter = 0;
}
return false;
}
【问题讨论】:
-
可以使用 int counter = 0;在第一个 for 循环内。然后,您可以删除
else counter = 0; -
写一些难以理解的linq! (这实际上可能是这里要做的事情。)
-
更严重的是,解决这个问题的标准方法(除非你可以这样简化代码)是使用一些块(如内部 for 循环)来分隔函数。
-
不知道该指标,但看起来
class1.GetBoard()不依赖于j和k,所以我肯定会只调用一次(!)外部 for 循环,而不是调用它8*3次 inside for 循环。player.WhichPlayer()也是如此。 -
一个微优化可以基于
counter实际上只在外循环中本地使用;将定义和初始化移到其顶部,从而避免 else 分支。