你认为圈复杂度是一个有用的衡量标准吗?

Pau*_*son 53 refactoring metrics cyclomatic-complexity code-metrics

我一直在玩测量大代码库的圈复杂度.

循环复杂性是通过程序源代码的线性独立路径的数量,并且有许多免费工具可供您选择的语言.

结果很有趣,但并不令人惊讶.也就是说,我知道最毛茸茸的部分实际上是最复杂的(评级> 50).但我发现有用的是,在决定从哪里开始重构时,我可以指出为每个方法分配一个具体的"坏"数字.

你使用圈复杂度吗?您找到的最复杂的代码是什么?

ken*_*418 37

我们无情地重构,并使用Cyclomatic复杂性作为在我们的"命中列表"上获取代码的指标之一.1-6我们没有标注复杂性(尽管可能因其他原因而受到质疑),7-9是值得怀疑的,除非另有证明,否则任何超过10的方法都被认为是坏的.

我们所看到的最糟糕的是来自我们不得不接管的一些遗留代码中的一个怪异的if-else-if链.

  • 87?这是一个非常彻底的箭头反模式实施...真诚的哀悼. (6认同)
  • 那么基本上一个连续包含10个if语句的高度顺序函数会使测试失败吗? (3认同)
  • 今晚我刚刚研究了 CC,因为我试图为项目的代码清理提供有效的攻击计划。最坏的违规者是单个方法的 450 个和一个类的 1,289 个(不,我没有写任何一个)。都是好游戏。叹............ (2认同)
  • 刚加入一家公司,发现一个windows窗体有1518 (2认同)

ott*_*akt 18

实际上,除了方法级阈值之外,还可以使用圈复杂度.对于初学者来说,一个高复杂度的大方法可以分解为几个复杂程度较低的小方法.但它真的改善了代码库吗?当然,所有这些方法名称的可读性都会提高一些.但总条件逻辑没有改变.通过用多态替换条件,通常可以减少总条件逻辑.

我们需要一个仅通过方法分解不会变为绿色的指标.我称之为CC100.

CC100 = 100*(代码库的总圈复杂度)/(总代码行数)

  • 但可测试性已得到改进:即使逻辑没有改变,也可以(原则上)单独测试单独的方法.当然,如果这些方法也依赖于很多全局状态,这就不成立,但这本身就是一个问题. (4认同)
  • *用多态性*替换条件可能会降低圈复杂度,但也会降低其局部可理解性. (4认同)

Ken*_*Ken 12

它对我很有用,就像big-O有用一样:我知道它是什么,并且可以使用它来获得一个方法是好还是坏的直觉,但我不需要为每个方法计算它功能我写的.

我认为更简单的指标,如LOC,在大多数情况下至少同样好.如果一个功能不适合一个屏幕,它几乎无关紧要.如果一个函数需要20个参数并产生40个局部变量,那么它的圈复杂度是否为1并不重要.


Mar*_*tta 7

我们最近开始使用它.我们使用NDepend进行一些静态代码分析,并测量圈复杂度.我同意,这是识别重构方法的一种不错的方法.

可悲的是,我们已经看到我们的开发人员在海外创建的一些方法的#200以上.

  • 今晚我们在地狱用餐! (3认同)

Rob*_*uld 7

在有一个可以很好地使用C++模板和元编程技术的工具之前,它对我的​​情况没什么帮助.无论如何只记得那个

"并非所有可以衡量的东西都可以衡量,而不是所有可以衡量的东西都可以计算"爱因斯坦

所以请记住通过人工过滤传递这种类型的任何信息.


Dav*_*ton 6

当你看到它时,你会知道复杂性.这种工具的主要用途是标记逃避注意力的代码部分.

  • 如果您*不*知道代码,它也很有用. (3认同)