用于函数/方法的令牌计数究竟是什么?

时间:2015-12-22 21:02:49

标签: cyclomatic-complexity

我一直在使用一些工具来衡量代码质量和CCN (Cyclomatic Complexity Number),其中一些工具提供了函数中令牌的计数,这些计数对我的函数或方法有什么影响?它用于什么?

3 个答案:

答案 0 :(得分:2)

Cyclomatic Complexity Number是一个指示功能,程序或程序复杂性的指标。我发现的最好(足够大且直观)的解释是here

我认为tokens指的是conditional statements tokens实际上考虑了计算圈复杂度的问题。

[稍后编辑]

高CCN意味着复杂的代码:

  • (更多)阅读和理解
  • 很难维护
  • 单元测试难以维护,因为更难以达到体面的code coverage
  • 可能会导致more bugs

可以使用各种技术减少CCN。可以看到一些示例herehere

答案 1 :(得分:0)

在CCN工具的上下文中,令牌是任何不同的运算符或操作数。 如何执行此操作取决于工具。由于Lizard上的页面没有详细介绍,因此您必须检查源代码(它的行数不多)

https://github.com/terryyin/lizard/tree/master/lizard_languages

如果在源中搜索“令牌”,您将看到该工具如何解析代码。在大多数情况下,它正在寻找代码块,表达式,注释和方法/对象的访问。

例如,根据java.py,仅将Java解析为“ {”,“ @”和“。”。 不确定为什么不寻找表达方式...?

答案 2 :(得分:0)

OP 尚未声明他们正在使用哪种工具,但对于 lizard,这是作为 issue 询问的,因此它可能对某人有所帮助

<块引用>

token 是单词和运算符等

例如:if (abc % 3 != 0)[‘if’, ‘(‘, ‘abc’, ‘%’, ‘3’, ‘!=‘, ‘0’, ‘)’] 8 个令牌。

还有另一个具有类似描述的 source

<块引用>

一个程序最多可以有 8192 个令牌。每个令牌都是一个词 (例如变量名)或运算符。对括号和字符串计数 作为 1 个令牌。逗号、句点、LOCAL、分号、END 和注释 不计算在内。

现在的下一个问题是,令牌的数量会像 CNN 一样重要吗?免责声明我不是代码质量方面的专家,这取决于语言。例如,在编译语言中,您可能希望将复杂的一行分成多行,这会增加标记的数量,但会显着提高代码的可读性。你应该去尝试,现代编译器足够聪明来优化它们。

然而,这在解释性语言中可能并非如此。同样,您应该查看您正在使用的特定语言,以确保幕后是否有任何优化。话虽如此,某些语言(例如 Python)提供了减少标记数量的语法。只要它是用语言设计的,那就太好了。

TL;DR:这个因素与代码可读性无关。仔细检查您的代码是否很高,但不要弄乱代码以降低它。