golongfuncs es una herramienta para buscar funciones "largas" por varias medidas (y combinaciones de medidas).
Esta herramienta puede ayudarlo a responder la línea de preguntas:
En otras palabras, te ayudará a filtrar funciones largas y complejas de aquellas que son largas .
go install github.com/tkrajina/golongfuncs/...
Esta herramienta puede calcular la siguiente función de "longitud" y "complejidad" mide:
lines : Número de líneas sin líneas vacías, líneas que terminan los bloques (que contienen solo } ) y comentarios ,total_lines : número de líneas que incluyen líneas y comentarios vacíos ,len : Número de caracteres en la función (sin comentarios y líneas vacías).total_len : número de caracteres en la función (con comentarios y líneas vacías).comments : Número de comentarios. Multiline Comments se cuentan una vez,comment_lines : número de líneas de comentarios,complexity : complejidad ciclomática (de Gocyclo),max_nesting : profundidad de bloques anidados máximos (nota, las inicializaciones de estructura no se cuentan),total_nesting : anidación total (en otras palabras, si el código está formateado correctamente: cada pestaña de sangría se cuenta una vez)in_params : el número de parámetros de entrada de funciónout_params : el número de parámetros de salida de la funciónvariables : el número de variables en el alcance de la función (sin argumentos de función y receptores de función)assignments : el número de asignaciones en la función (incluidas las declaraciones variables,: := , = , += , -= ...)control : el número de declaraciones de flujo de control ( if , else , switch , case , default , select y defer )todos : El número de etiquetas "TODO" que se encuentran en los comentarios (incluido el cuerpo de la función y el recomendación anterior a la función). Las etiquetas son HACK , TODO , NOTE , FIXME , ASAP , ISSUE , BUG y WTF .Además de ellos, puedes combinar medidas. Por ejemplo:
complexity/lines : calcula la complejidad promedio por línea de código.total_nesting/total_lines : calcula la anidación promedio (sangría) por línea.comment_lines/total_lines : calcula líneas de funciones por línea.Para calcular cualquiera de esas medidas para su código Golang:
$ golongfuncs +variable
$ golongfuncs +total_nesting
$ golongfuncs +lines
$ golongfuncs +lines,complexity
$ golongfuncs +lines,complexity,complexity/lines
Llamar solo golongfuncs (sin argumentos) es un alias para golongfuncs +lines .
$ golongfuncs [flags] +[types] [paths...]
Encuentra funciones más largas:
$ golongfuncs <go_file>
$ golongfuncs <directory>
$ golongfuncs <directory>/...
Si no se especifica la ruta, GolongFuncs supone que es ./...
Mostrar múltiples medidas:
$ golongfuncs +lines
$ golongfuncs +lines,in_params
$ golongfuncs +lines,in_params,complexity/lines
$ golongfuncs +lines +in_params +complexity/lines
Si se especifican múltiples medidas, los resultados se clasifican por la primera columna (en estas lines de ejemplo):
Por defecto, el resultado muestra solo los 20 mejores resultados. Cambiar eso con -top :
$ golongfuncs -top 50
Por defecto, se ignoran las funciones de menos de 10 líneas. Puede cambiar eso con -min-lines <n> .
Las 100 funciones más complejas:
$ golongfuncs -top 100 +complexity ./...
Las funciones más complejas de más de 50 líneas:
$ golongfuncs -min-lines 50 +complexity ./...
Encuentre funciones largas, pero calcule también su complejidad, complejidad AVG y anidación de 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
Puede ver que ExampleVeryLongfunction es larga (305 líneas), pero la complejidad promedio es baja (0.1) y la anidación de AVG es 1.0. AVG Nesting 1.0 significa que no hay bloques anidados en esta función. Si la mitad de las líneas estuvieran en un bloque anidado (por ejemplo, un gran if <expr> { ...code... } bloque de código) El anidación AVG sería 1.5.
El ExampleVeryComplexFunction es más corta (69 líneas) pero con una complejidad promedio (por línea de código) de 0.6 y AVG anidando 6.7 y esa es una buena pista de que la función necesita refactorización.
Encuentre funciones de más de 5 líneas con anidación AVG (por línea de código) más de 5 e incluyen recuento de líneas totales y líneas:
$ 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
Encuentre funciones con la longitud de línea promedio más larga:
$ golongfuncs +len/lines ./...
$ golongfuncs +total_len/total_lines ./...
Se ignoran las pruebas y los archivos proveedores, usan -include-tests y -include-vendor Si desea medirlos.
Los archivos/directorios arbitrarios se pueden ignorar con -ignore "<regexp>" . Por ejemplo, si desea ignorar los archivos de Golang que contienen _generated.go : -ignore "^.*_generated.go$" .
Las funciones se pueden ignorar con -ignore-func "regexp" .
Esta herramienta tiene licencia bajo la licencia Apache, versión 2.0