golongfuncs - это инструмент для поиска «длинных» функций по различным показателям (и комбинациям мер).
Этот инструмент может помочь вам ответить на строку вопросов:
Другими словами, это поможет вам отфильтровать длинные и сложные функции из тех, которые просто длинные .
go install github.com/tkrajina/golongfuncs/...
Этот инструмент может рассчитать следующую функцию «длина» и «сложность»:
lines : количество строк без пустых строк, блоков заканчивающих линий (только } ) и комментарии ,total_lines : количество строк , включая пустые строки и комментарии ,len : Количество символов в функции (без комментариев и пустых строк).total_len : количество символов в функции (с комментариями и пустыми строками).comments : Количество комментариев. Многослойные комментарии учитываются один раз,comment_lines : количество строк комментариев,complexity : цикломатическая сложность (от gocyclo),max_nesting : максимальная вложенная глубина блоков (примечание, инициализация структуры не учитывается),total_nesting : общее гнездование (другими словами, если код отформатируется должным образом - каждая вкладка отсчитана один раз)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 : вычисляет строки функций на строку.Чтобы рассчитать любую из этих измерений для вашего кода Голанга:
$ golongfuncs +variable
$ golongfuncs +total_nesting
$ golongfuncs +lines
$ golongfuncs +lines,complexity
$ golongfuncs +lines,complexity,complexity/lines
Вызов Just 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 Nesting 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>" . Например, если вы хотите игнорировать файлы Golang, содержащие _generated.go : -ignore "^.*_generated.go$" .
Функции могут быть проигнорированы с -ignore-func "regexp" .
Этот инструмент лицензирован по лицензии Apache, версия 2.0