【发布时间】:2015-12-22 21:02:49
【问题描述】:
我一直在使用一些工具来衡量代码质量,CCN (Cyclomatic Complexity Number) 和其中一些工具提供了函数中标记的计数,该计数对我的函数或方法有何意义?它是干什么用的?
【问题讨论】:
-
你用的是什么工具?
-
我正在使用
Lizard和OCLint,但也尝试过Clang analyzer
我一直在使用一些工具来衡量代码质量,CCN (Cyclomatic Complexity Number) 和其中一些工具提供了函数中标记的计数,该计数对我的函数或方法有何意义?它是干什么用的?
【问题讨论】:
Lizard 和OCLint,但也尝试过Clang analyzer
圈复杂度数是表示功能、过程或程序复杂性的指标。我找到的最好的(足够大和直观的)解释是here。
我认为tokens 指的是conditional statements tokens,实际上是在计算圈复杂度时考虑的。
[稍后编辑]
高 CCN 意味着复杂的代码:
【讨论】:
在 CCN 工具的上下文中,标记是任何不同的运算符或操作数。 如何实现取决于工具。由于 Lizard 的页面没有详细介绍,因此您必须检查源代码(它的行数不多)
https://github.com/terryyin/lizard/tree/master/lizard_languages
如果您搜索“token”的来源,您将看到该工具是如何解析代码的。在大多数情况下,它正在寻找代码块、表达式、注释和方法/对象的访问。
例如,根据 java.py,Java 只解析 '{'、'@' 和 '.' 不知道为什么它不寻找表达式...?
【讨论】:
OP 尚未声明他们正在使用哪个工具,但对于蜥蜴,这已作为 issue 提出要求,因此它可能对某人有所帮助
token是单词和运算符等
例如:
if (abc % 3 != 0)有[‘if’, ‘(‘, ‘abc’, ‘%’, ‘3’, ‘!=‘, ‘0’, ‘)’]8 个令牌。
另外一个source也有类似的描述:
一个程序最多可以有 8192 个令牌。每个token就是一个词 (例如变量名)或运算符。成对的括号和字符串计数 作为 1 个令牌。逗号、句点、LOCAL、分号、END 和 cmets 不计算在内。
现在下一个问题是,令牌的数量会像 CNN 一样重要吗?免责声明我不是代码质量专家,这取决于语言。例如,在编译语言中,您可能希望将复杂的行分成多行,这会增加标记的数量,但会显着提高代码的可读性。你应该去做,现代编译器足够聪明,可以优化它们。
但是,这在解释型语言中可能并非如此。同样,您应该查看您正在使用的特定语言,以确保在幕后是否有任何优化。话虽如此,某些语言(例如 Python)提供了语法来减少标记的数量。只要它是用该语言设计的,那就太好了。
TL;DR:这个因素并不像代码可读性那么重要。仔细检查您的代码是否很高,但不要弄乱代码以降低它。
【讨论】: