golongfuncs是通过各种度量(以及度量组合)搜索“长”功能的工具。
此工具可以帮助您回答问题线:
换句话说,它将帮助您从距离长时间的长度功能中过滤漫长而复杂的功能。
go install github.com/tkrajina/golongfuncs/...
该工具可以计算以下功能“长度”和“复杂性”测量:
lines :没有空行的行数,线结束块(仅包含} )和注释,total_lines :线数,包括空行和注释,len :功能中的字符数(没有注释和空行)。total_len :功能中的字符数(带有注释和空行)。comments :评论数。多琳评论一次,一次comment_lines :评论行的数量,complexity :循环复杂性(来自Gocyclo),max_nesting :最大嵌套块深度(注意,构造初始化),total_nesting :Total嵌套(换句话说,如果代码的格式正确 - 每个缩进选项卡都被计数一次)in_params :函数输入参数的数量out_params :功能输出参数的数量variables :函数范围中的变量数(没有函数参数和函数接收器)assignments :函数中的作业数(包括变量声明, := , = , += , -= ...)control :控制流语句的数量( if是else , switch , case default select和defer )todos :在注释中找到的数字“ todo”标签(包括功能主体和函数之前的表彰)。标签是HACK , TODO , NOTE , FIXME , ASAP , ISSUE , BUG和WTF 。除此之外,您还可以结合措施。例如:
complexity/lines :计算每行代码的平均复杂度。total_nesting/total_lines :计算每行平均嵌套(缩进)。comment_lines/total_lines :计算每行函数行。计算您的Golang代码的任何措施:
$ golongfuncs +variable
$ golongfuncs +total_nesting
$ golongfuncs +lines
$ golongfuncs +lines,complexity
$ golongfuncs +lines,complexity,complexity/lines
仅呼叫golongfuncs (无参数)是golongfuncs +lines的别名。
$ golongfuncs [flags] +[types] [paths...]
找到最长的功能:
$ golongfuncs <go_file>
$ golongfuncs <directory>
$ golongfuncs <directory>/...
如果未指定路径,则GolongFuncs假定是./...
显示多种措施:
$ golongfuncs +lines
$ golongfuncs +lines,in_params
$ golongfuncs +lines,in_params,complexity/lines
$ golongfuncs +lines +in_params +complexity/lines
如果指定了多个度量,则将结果通过第一列(在此示例lines中)对:
默认情况下,结果仅显示前20个结果。用-top更改它:
$ golongfuncs -top 50
默认情况下,功能短于10行。您可以使用-min-lines <n>更改它。
100个最复杂的功能:
$ golongfuncs -top 100 +complexity ./...
最复杂的功能超过50行:
$ golongfuncs -min-lines 50 +complexity ./...
找到长功能,但还计算出它们的复杂性,AVG复杂性和AVG嵌套:
$ golongfuncs +lines,complexity,complexity/lines,total_nesting/total_lines .
ExampleVeryLongfunction golongfuncs/runner_test.go:118:1 lines=305.0 complexity=1.0 complexity/lines=0.1 total_nesting/total_lines=1.0
ExampleVeryComplexFunction golongfuncs/runner_test.go:10:1 lines=69.0 complexity=44.0 complexity/lines=0.6 total_nesting/total_lines=6.7
printStats main.go:54:1 lines=21.0 complexity=9.0 complexity/lines=0.4 total_nesting/total_lines=2.5
main main.go:12:1 lines=19.0 complexity=3.0 complexity/lines=0.2 total_nesting/total_lines=1.0
TestLines golongfuncs/runner_test.go:476:1 lines=15.0 complexity=2.0 complexity/lines=0.1 total_nesting/total_lines=0.9
NewVisitor golongfuncs/runner.go:94:1 lines=15.0 complexity=3.0 complexity/lines=0.2 total_nesting/total_lines=1.0
Get golongfuncs/models.go:34:1 lines=15.0 complexity=7.0 complexity/lines=0.5 total_nesting/total_lines=1.7
TestNesting golongfuncs/runner_test.go:438:1 lines=15.0 complexity=2.0 complexity/lines=0.1 total_nesting/total_lines=0.9
您可以看到ExampleVeryLongfunction功能很长(305行),但平均复杂性较低(0.1),而AVG嵌套为1.0。 AVG嵌套1.0意味着此功能中没有嵌套块。如果一半的线在一个嵌套的块中(例如, if <expr> { ...code... }代码的块)AVG嵌套为1.5。
ExampleVeryComplexFunction较短(69行),但平均复杂性(每行代码)为0.6和AVG嵌套6.7,这可能是一个很好的提示,即功能需要进行重构。
查找超过5行的功能,其中AVG嵌套(每行代码)大于5,其中包括总线数和行计数:
$ golongfuncs +total_nesting/total_lines,total_lines,lines -threshold 5 .
ExampleVeryComplexFunction golongfuncs/runner_test.go:10:1 total_nesting/total_lines=6.7 total_lines=108.0 lines=69.0
查找平均线长度最长的功能:
$ golongfuncs +len/lines ./...
$ golongfuncs +total_len/total_lines ./...
测试和供应商的文件被忽略,如果要测量它们,请使用-include-tests和-include-vendor 。
任意文件/目录可以用-ignore "<regexp>"忽略。例如,如果您想-ignore "^.*_generated.go$"包含_generated.go Golang文件。
可以使用-ignore-func "regexp"忽略功能。
此工具已根据Apache许可证(版本2.0)许可