golongfuncs é uma ferramenta para pesquisar funções "longas" por várias medidas (e combinações de medidas).
Esta ferramenta pode ajudá -lo a responder à linha de perguntas:
Em outras palavras, ajudará você a filtrar funções longas e complexas daquelas que são longas .
go install github.com/tkrajina/golongfuncs/...
Esta ferramenta pode calcular as seguintes medidas de "comprimento" e "complexidade" da função:
lines : Número de linhas sem linhas vazias, linhas que terminam blocos (contendo apenas } ) e comentários ,total_lines : Número de linhas , incluindo linhas e comentários vazios ,len : Número de caracteres na função (sem comentários e linhas vazias).total_len : número de caracteres na função (com comentários e linhas vazias).comments : Número de comentários. Comentários multilinas são contados uma vez,comment_lines : Número de linhas de comentários,complexity : complexidade ciclomática (de Gocyclo),max_nesting : MAX BLOCO DETENTES DE INTERENCIDADE (NOTA, as inicializações da estrutura não são contadas),total_nesting : Ninho total (em outras palavras, se o código for formatado corretamente - cada guia de recuperação é contada uma vez)in_params : o número de parâmetros de entrada de funçãoout_params : o número de parâmetros de saída da funçãovariables : o número de variáveis no escopo da função (sem argumentos de função e receptores de função)assignments : o número de atribuições na função (incluindo declarações variáveis , := , = , += , -= ...)control : o número de instruções de fluxo de controle ( if , else , switch , case , default , select e defer )todos : o número "TODO" tags encontradas nos comentários (incluindo o corpo da função e o elogio que precede a função). As tags são HACK , TODO , NOTE , FIXME , ASAP , ISSUE , BUG e WTF .Além disso, você pode combinar medidas. Por exemplo:
complexity/lines : calcula a complexidade média por linha de código.total_nesting/total_lines : calcula o ninho médio (indentação) por linha.comment_lines/total_lines : calcula linhas de funções por linha.Para calcular qualquer uma dessas medidas para o seu código de Golang:
$ golongfuncs +variable
$ golongfuncs +total_nesting
$ golongfuncs +lines
$ golongfuncs +lines,complexity
$ golongfuncs +lines,complexity,complexity/lines
Chamar apenas golongfuncs (sem argumentos) é um alias para golongfuncs +lines .
$ golongfuncs [flags] +[types] [paths...]
Encontre funções mais longas:
$ golongfuncs <go_file>
$ golongfuncs <directory>
$ golongfuncs <directory>/...
Se o caminho não for especificado, o GolongFuncs assume que é ./...
Mostrar várias medidas:
$ golongfuncs +lines
$ golongfuncs +lines,in_params
$ golongfuncs +lines,in_params,complexity/lines
$ golongfuncs +lines +in_params +complexity/lines
Se várias medidas forem especificadas, os resultados serão classificados pela primeira coluna (neste exemplo, lines ):
Por padrão, o resultado mostra apenas os 20 principais resultados. Mude isso com -top :
$ golongfuncs -top 50
Por padrão, funções mais curtas que 10 linhas são ignoradas. Você pode mudar isso com -min-lines <n> .
As 100 funções mais complexas:
$ golongfuncs -top 100 +complexity ./...
As funções mais complexas mais de 50 linhas:
$ golongfuncs -min-lines 50 +complexity ./...
Encontre funções longas, mas calcule também sua complexidade, complexidade AVG e ninho 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
Você pode ver que ExampleVeryLongfunction é longa (305 linhas), mas a complexidade média é baixa (0,1) e o ninho de AVG é 1,0. AVG Nesting 1.0 significa que não há blocos aninhados nesta função. Se metade das linhas estivesse em um bloco aninhado (por exemplo if <expr> { ...code... } de código), o ninho AVG seria 1.5.
A ExampleVeryComplexFunction é mais curta (69 linhas), mas com uma complexidade média (por linha de código) de 0,6 e ninho de AVG 6.7 e isso é provavelmente uma boa dica de que a função precisa refatorar.
Encontre funções com mais de 5 linhas com o ninho AVG (por linha de código) maior que 5 e inclua a contagem total de linhas e contagem de linhas:
$ 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
Encontre funções com maior comprimento médio de linha:
$ golongfuncs +len/lines ./...
$ golongfuncs +total_len/total_lines ./...
Testes e arquivos vendidos são ignorados, use -include-tests e -include-vendor se você quiser medi -los.
Arquivos/diretórios arbitrários podem ser ignorados com -ignore "<regexp>" . Por exemplo, se você deseja ignorar os arquivos Golang que contêm _generated.go : -ignore "^.*_generated.go$" .
As funções podem ser ignoradas com -ignore-func "regexp" .
Esta ferramenta está licenciada sob a licença Apache, versão 2.0