【问题标题】:How do I improve cyclomatic complexity of some options?如何提高某些选项的圈复杂度?
【发布时间】:2024-01-24 02:08:01
【问题描述】:

那么我是否只是通过抑制它来忽略此代码分析警告?或者有没有办法真正解决它?

这是一个与我很接近的用户故事,但我对其稍作更改,以使公司信息不在网站上...

假设我有一个向 15 个国家/地区发货的公司的网站,他们希望从相应的 resources.resx 文件中以用户选择的语言显示这些国家/地区的名称。 现在我在列表中的“选项”比名称/值或键/值对更复杂。所以当前代码有一个返回所有选项的方法,所以它可能看起来像:

return new[]
{
    new CountryOption(code1, resourceKey1, someOtherValue1),
    new CountryOption(code2, resourceKey2, someOtherValue2),
    new CountryOption(code3, resourceKey3, someOtherValue3),
    ... (repeat 12 more times so I have 15 countries)
};

因此,我得到了可供选择的所有国家/地区的列表 (IEnumerable<CountryOption>)。
大多数此类应用程序将从数据库中读取此类信息,但这些数据很少更改,将其放入数据库会降低站点的性能。可以将其放入一个平面文件中进行读取,但同样,在代码中编译会更快。最后,我们确实进行了一些单元测试,以确保这些信息在每次构建时都运行正确(数据库中的信息更难做到)。

降低已知值列表的圈复杂度的唯一方法是从代码外部的某个源中读取它吗? (如果是这样,隐藏消息可能是正确的做法。)

【问题讨论】:

  • 请问为什么在这种特定情况下圈复杂度很高?只有一条路要走,没有某种分支,对吧?据我了解,您显示的方法的圈复杂度为 1。我正确吗?
  • 不要仅仅为了它而降低圈复杂度。使用圈复杂度作为工具来寻找需要重构的代码的潜在 sn-ps。
  • 至少可以说,很难看出问题中描述的任何内容会导致高圈复杂度得分。请提供一个好的minimal reproducible example 可靠地重现该问题。请提供更多详细信息,说明得分高的原因以及您已经尝试过哪些降低得分的方法。
  • @Kzrystof,@Peter Duniho - 我会调查更多。我尝试了一个简单的类,它有 2 个属性 int Keystring Name,但圈复杂度只有 1?所以我不确定为什么使用我们的类添加到数组中的项目数量更少会生成 27(基本上数组中每个项目 2 个。)
  • 我的猜测是 CountryOption 类 ctor 做了很多事情 :)你能调查一下吗?

标签: c# code-analysis cyclomatic-complexity


【解决方案1】:

正如其他人指出的那样,单独创建一个集合的圈复杂度为 1。但是集合中的对象使用 func<string>,这导致复杂度上升 - 基本上每个项目的复杂度为 2收藏!感谢您的帮助。

【讨论】: