我已经玩弄测量大的代码库的圈复杂度。

圈复杂度是通过一个程序的源代码的线性独立路径的数量并有大量的免费工具供你选择的语言。

结果是有趣的,但并不令人吃惊。也就是说,我知道是hairiest实际上是最复杂(有等级> 50)的部分。但是,我发现有用的是一个具体的“坏”号分配给每一个方法的东西我可以指出决定从哪里开始重构时。

您使用圈复杂度?什么是代码的最复杂一点,你发现了什么?

有帮助吗?

解决方案

我们无情地重构,并使用圈复杂度为得到我们的“打榜”上的代码指标之一。 1-6我们没有标志的复杂性(虽然它可以得到质疑其他原因),7-9是值得怀疑的,并且假定超过10的任何方法是坏的,除非能证明并非如此。

我们见过最糟糕的是在一些遗留代码,我们不得不采取了一个可怕的if-else-IF链87。

其他提示

事实上,圈复杂度可以投入使用的不仅仅是方法级别的阈值。对于初学者来说,具有高复杂性的一种大方法可以分解成几个小方法,以较低的复杂性。但它确实提高了代码库?当然,你可以用所有的方法名获得稍好的可读性。但总的条件逻辑并没有改变。并且通常可以通过与多态性替换条件句的总的条件逻辑。

我们需要的不只是被分解的方法变成绿色的度量。我把这种 CC100

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

这是对我很有用的相同的方式,大O是有用的:我知道这是什么,可以用它来获得一个直觉的方法是好的还是坏的,但我并不需要计算它为每一个功能我已经写了。

我想简单的指标,例如LOC,至少在大多数情况下为好。如果一个函数不适合在一个屏幕上,它几乎没有关系是多么简单。如果一个函数具有20个参数,并使得40个局部变量,如果它的圈复杂度是1不要紧。

我们最近开始使用它。我们使用NDepend的做一些静态代码分析,并测量圈复杂度。我同意,这是查明重构方法,一个体面的方式。

不幸的是,我们看到#的超过了200:我们的开发人员创建海上的一些方法。

直到有一个工具,可以用C ++模板和元编程技术很好地工作,这不是在我的处境有很大帮助。反正只记得

  

“不是计数所有的东西都可以   测量的,而不是所有的东西,可以   是测量的计数”   爱因斯坦

所以记住通过这种类型的通过人类滤波过的任何信息。

您会知道的复杂性,当你看到它。最主要的这种工具是有用的标记是被转义你注意代码的部分。

我频繁地测量我的代码的圈复杂度。我发现它帮助我发现正在做太多的代码区。具有工具指出在我的代码的热点要少得多耗时比具有通过数千试图找出哪些方法没有关注的SRP的代码行的读取。

不过,我发现,当我在其他人的代码做一个圈复杂度分析,它通常会导致沮丧,焦虑和愤怒一般的感情,当我找到圈在100的复杂代码。究竟是什么让人们写有几千行代码在他们的方法呢?!

这是伟大的标识重构的目标帮助,但让你的判断周围是非常重要的。我会支持kenj0418的范围修剪指南。

有是所谓的Java指标 CRAP4J 是经验结合圈复杂度和JUnit测试覆盖率要拿出一个单度量。他一直在做研究,尝试和改进他的经验公式。我不知道它是多么普遍。

我没有在使用了一段时间,但先前的专案它真的帮助了别人的代码,找出潜在的故障点(不会,当然我的!)

在与逻辑和一些非常奇怪的WTF代码中发现该地区的退房,我很快找到numerious问题(也大量GOTOS的你会相信!)。

圈复杂度是伟大的,显示这可能是做得多的地区,因此打破了单一负有责任prinicpal。这些真实理想地应被分解成多张的功能

恐怕该项目的语言,我最想这样,的 LPC ,没有,事实上,大量的免费工具,用于生产它可用。所以,不,不是这样对我很有用。

+1 kenj0418的打榜值。

我见过的最糟糕的是275有一对夫妇别人超过200,我们能够向下重构到更小的CC;他们仍然很高,但它得到了他们进一步推回线。我们没有与275兽多少运气 - 这是(可能现在仍然是)如果 - 的网络和开关语句只是太复杂。它唯一的真正值作为步进式当他们决定重建系统。

要高CC我是舒服是工厂例外; IMO,它们应该具有高的CC,但只有当它们仅做简单的对象创建并返回。

的理解是什么意思,我现在已经开始使用它了“审判”的基础上。到目前为止,我发现它是有用的,因为通常高CC齐头并进与箭头反模式,这使得代码难以阅读和理解。我没有固定数量还,但NDepend的提示中的一切高于5,它看起来像一个良好的开端,调查方法。

是的,我们使用它,我发现它有用的。我们有一个大的遗留代码库驯服,我们发现alaraming高圈复杂度。 (387在一个方法!)。 CC点,你直接说是值得重构的区域。我们使用CCCC上C ++代码。

圈复杂度只是一个可称为捏造复杂composant。前阵子,我写了一篇文章,总结代码复杂度几个方面: 格斗装配式复杂性

工具是需要的是在处理代码的复杂性有效。对于.NET代码的工具 NDepend的会让你分析代码的复杂性,包括代码度量一样的许多方面: 圈复杂,嵌套深度,缺乏方法的凝聚力,通过测试覆盖率...

包括依赖性分析和包括专用于询问语言(代码查询语言)什么是复杂的在我的代码,并写入规则?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top