CK рассчитывает метрики кода на уровне класса и метода в проектах Java с помощью статического анализа (то есть нет необходимости в скомпилированном коде). В настоящее время он содержит большой набор метрик, в том числе знаменитый CK:
CBO (связь между объектами) : считает количество зависимостей, которые имеет класс. Инструменты проверяют любой тип, используемый во всем классе (объявление поля, типы возврата метода, объявления переменных и т. Д.). Он игнорирует зависимости от самой Java (например, java.lang.string).
CBO модифицирован (связь между объектами) : считает количество зависимостей, которые имеет класс. Это очень похоже на оригинальный CBO CKTool. Тем не менее, этот показатель рассматривает зависимость от класса как как ссылки, которые делают для других, так и ссылки, которые он получает от других типов.
Fan-In : Подсчитает количество зависимостей ввода, которые у класса есть, то есть количество классов, которые ссылаются на конкретный класс. Например, учитывая класс X, фанатом X будет количество классов, которые называются x, ссылаясь на его атрибут, доступ к некоторым его атрибутам, вызывая некоторые из его методов и т. Д.
FAN-OUT : Подсчитает количество выходных зависимостей, которые у класса есть, то есть количество других классов, на которые ссылается конкретный класс. Другими словами, учитывая класс X, фанат x-это количество классов, называемых x через ссылку на атрибуты, призывы к методам, экземпляры объекта и т. Д.
DIT (Дерево наследования глубины) : он считается количеством «отцов», которые есть у класса. Все классы имеют DIT не менее 1 (каждый наследует java.lang.object). Чтобы это произошло, классы должны существовать в проекте (то есть, если класс зависит от x, который зависит от файла JAR/зависимости, а X зависит от других классов, DIT считается 2).
NOC (количество детей) : он считается количеством непосредственных подклассов, которые имеет конкретный класс.
Количество полей : подсчитывает количество полей. Конкретные числа для общего количества полей, статических, государственных, частных, защищенных, дефолтных, окончательных и синхронизированных полей.
Количество методов : подсчитывает количество методов. Конкретные числа для общего количества методов, статических, публичных, абстрактных, частных, защищенных, дефолтных, окончательных и синхронизированных методов. Методы конструктора также учитываются здесь.
Количество видимых методов : подсчитывает количество видимых методов. Метод виден, если он не является частным.
NOSI (количество статических вызовов) : считает количество призывов к статическим методам. Он может считать только те, которые могут быть разрешены с помощью JDT.
RFC (ответ для класса) : считает количество уникальных вызовов метода в классе. Поскольку призывы разрешаются посредством статического анализа, эта реализация не выполняется, когда метод имеет перегрузку с одинаковым количеством параметров, но разные типы.
WMC (класс метода веса) или сложность МакКейба . Он считается количеством филиалов в классе.
LOC (Lines of Code) : он подсчитывает строки подсчета, игнорируя пустые строки и комментарии (т.е. это исходные строки кода или SLOC). Количество строк здесь может немного отличаться от исходного файла, поскольку мы используем внутреннее представление JDT исходного кода для его расчета.
LCOM (Отсутствие сплоченности методов) : рассчитывает метрику LCOM. Это самая первая версия метрики, которая не является надежной. LCOM-HS может быть лучше (надеюсь, вы отправите нам запрос на привлечение).
LCOM* (Отсутствие сплоченности методов) : этот показатель представляет собой модифицированную версию текущей версии LCOM, реализованной в инструменте CK. LCOM* - это нормализованная метрика, которая вычисляет отсутствие сплоченности класса в диапазоне от 0 до 1. Затем, чем ближе к 1 значению LCOM* в классе, тем меньше степень сплоченности этого соответствующего класса. Чем ближе к 0 значение LCOM* в классе, наиболее сплоченность этого соответствующего класса. Эта реализация следует за третьей версией LCOM*, определенной в [1].
TCC (плотная сплоченность класса) : измеряет сплоченность класса с диапазоном значений от 0 до 1. TCC измеряет сплоченность класса посредством прямых соединений между видимыми методами, двумя методами или их деревьями вызова, доступ к одной и той же переменной класса.
LCC (сплоченность свободного класса) : аналогично TCC, но он дополнительно включает количество косвенных соединений между видимыми классами для расчета сплоченности. Таким образом, ограничение LCC> = TCC всегда сохраняется.
Количество возвратов : количество инструкций return .
Количество петлей : количество петель (т.е., для, в то время как, в то время как, повышенное для).
Количество сравнений : количество сравнений (т.е. == и! =). Примечание :! = доступно только в 0,4,2+.
Количество попыток/уловов : количество попыток/уловов
Количество скобок выражений : количество выражений внутри скобков.
Строковые литералы : количество строковых литералов (например, "John Doe" ). Повторные строки считаются столько раз, сколько они появляются.
Количество числа : количество литералов чисел (то есть, int, long, Double, Float).
Количество математических операций : количество математических операций (время, разделение, остаток, плюс, минус, левое дерьмо, правая смена).
Количество переменных : количество объявленных переменных.
Максимальные вложенные блоки : наибольшее количество блоков, вложенных вместе.
Количество анонимных классов, внутренних классов и выражений Lambda : название говорит все это. Обратите внимание, что всякий раз, когда объявляется анонимный класс или внутренний класс, он становится «совершенно новым классом», например, CK генерирует AB и AB $ C, C, C, являющийся внутренним классом внутри AB, однако, выражения лямбда не рассматриваются классы, и, таким образом, являются частью класса/метода, в который они включены. Класс или метод имеет только количество внутренних классов, которые объявляются на его уровне, например, внутренний класс, который объявляется внутри метода M2, который находится внутри анонимного класса A, который объявляется внутри метода M, который, наконец, объявляется внутри класса C, не будет учитываться в классе C, но только в методе M2 (метод первого уровня воплощено), и это воплощается в классе.
Количество уникальных слов : количество уникальных слов в исходном коде. На уровне метода он использует только тело метода в качестве входного. На уровне класса он использует весь тело класса в качестве метрик. Алгоритм в основном подсчитывает количество слов в методе/классе, после удаления ключевых слов Java. Имена разделены на основе случая верблюда и подчеркивания (например, Longname_likethis становится четырьмя словами). Смотрите класс WordCounter для получения подробной информации о реализации.
Количество операторов журнала : количество операторов журнала в исходном коде. В подсчете используется regex, совместимая с вызовами API SLF4J и LOG4J. См. NumberOfLogStatements.java и тестовые примеры ( NumberOfLogStatementsTest и fixtures/logs ) для получения дополнительной информации.
Имеет Javadoc : Boolean, указывающий, есть ли метод Javadoc. (Только на уровне метода на данный момент)
Модификаторы : общественные/абстрактные/частные/защищенные/нативные модификаторы классов/методов. Может быть декодирован с использованием org.eclipse.jdt.core.dom.Modifier .
Использование каждой переменной : как часто каждая переменная использовалась внутри каждого метода.
Использование каждого поля : как часто каждое локальное поле использовалось внутри каждого метода, локальное поле - поля в классе (подклассы не включены). Также обнаруживаются непрямые местные поля, непрямые использование локального поля включают все использование полей в дереве локального вызова класса, например, вызывает B и B Использование A, затем A косвенно используется A.
Призывы к методу : все непосредственно вызываемые методы, вариации являются локальными призывами и косвенными локальными призывами.
Примечание: CK разделяет классы, внутренние классы и анонимные классы. LOC является единственной метрикой, которая не полностью изолирована от других, например, если A имеет объявление внутреннего класса B, то LOC (A) = LOC (класс A) + LOC (внутренний класс B).
CK - это инструмент сбора метрик кода Java, оптимизированный в простую структуру, которая вращается вокруг трех основных пакетов:
Для краткости, в рамках этой документации префиксы пакетов, такие как com.github.mauricioaniche.ck , опущены.
CK управляет оркестровкой всего процесса сбора метрик. Он инициализирует метрические искатели, обрабатывает разделение файлов на основе доступной памяти, устанавливает анализаторы AST с соответствующими настройками среды и управляет потоком выполнения в разных каталогах и зависимостях JAR. Он динамически настраивает свое поведение на основе пользовательских вводов, таких как useJars , maxAtOnce и variablesAndFields для оптимизации обработки файлов Java для сбора метрик.ck . Этот класс обрабатывает аргументы командной строки для настройки и запуска процесса сбора метрик. Он обрабатывает пользовательский ввод для пути проекта, включения JAR, разделения файлов, детализации метрик и настройки выходного каталога. Runner организует общее выполнение, инициализируя и используя класс CK и обрабатывая результаты результата через ResultWriter .FileASTRequestor , компонент ядра Eclipse JDT (инструменты разработки Java). Он играет ключевую роль в структуре CK, организовав процесс сбора метрик. MetricsExecutor координирует создание абстрактного синтаксического дерева (AST) для исходных файлов Java, что важно для анализа и извлечения метрик кода. MetricsFinder: этот утилитный класс, расположенный в ck.utils , играет решающую роль в динамической идентификации и экземпляре классов метрических коллекторов в рамках CK. Он предназначен для классов, которые реализуют ClassLevelMetric и MethodLevelMetric Interfaces из пакета metrics .
MetricsFinder использует библиотеку Reflections для сканирования и загрузки классов коллекционеров в среде выполнения, что позволяет расширяемой и адаптируемой системе CK к новым показателям, не требуя модификаций основной архитектуры. Эта функция особенно полезна для плавной интеграции пользовательских метрик в процесс анализа.
CKVISITOR: интегральный компонент CK Framework, CKVisitor расширяет класс ASTVisitor , предоставленную библиотекой Eclipse JDT (инструменты разработки Java), позволяя подробному анализу и сбору метриков непосредственно из Abstract Syntax Tree (AST).
Посетитель предназначен для прохождения различных узлов AST, таких как типы и методы, и применять конкретные действия в каждом узле. Он эффективно управляет иерархией классов и методов на основе стека, позволяя рассчитывать и собирать метрики в контексте масштаба текущего узла.
Ckastvisitor: реализовано метрическими классами в ck.metrics , позволяя каждой метрике обрабатывать конкретные интересующие узлы AST, такие как призывы к методам и создания экземпляров класса.
ClassLevelmarce и MethodLevelmer: интерфейсы определяют методы сбора метрик на уровне класса и метода соответственно.
CKNotifier .CKClassResult и CKMethodResult с собранными данными.CK Framework включает в себя ряд устоявшихся дизайнерских шаблонов для улучшения модульности, расширяемости и обслуживаемости его кодовой базы. Эти паттерны позволяют структуре эффективно обрабатывать сложные операции, такие как пересечение абстрактных синтаксических деревьев (AST), сбор метрик и уведомление результатов. Ниже приведены ключевые шаблоны дизайна, используемые:
Паттерн посетителей: интерфейсы CKVisitor и CKASTVisitor реализуют шаблон посетителей, который имеет ключевое значение для обработки операций на различных узлах AST без изменения классов элементов, на которых он работает. Этот шаблон особенно полезен в сценариях, когда компонент должен выполнять различные и не связанные с ними операции в рамках классовой иерархии узлов AST. Он упрощает код путем экстернализации эксплуатационной логики в объекты для посетителей, облегчая простое добавление новых операций без изменения существующих классов узлов. Это разделение проблем приводит к более поддерживаемой и расширяемой кодовой базе, где разъединены структуры и операции узлов AST.
Паттерн уведомления: CK принимает шаблон уведомления с помощью CKNotifier , который действует как центральный механизм для трансляции результатов коллекции метрик всем зарегистрированным наблюдателям. Этот шаблон имеет решающее значение для создания слабо связанной архитектуры, в которой субъект (процесс метрического вычисления) не зависит от его наблюдателей (процессоры результатов или генераторы отчетов). Это позволяет CK уведомлять о нескольких компонентах о завершении показателей метрических расчетов без связи с конкретными компонентами, что повышает гибкость и масштабируемость системы.
Заводская паттерна: экземпляр метрических коллекционеров управляется MetricsFinder , который воплощает завод. Этот шаблон используется для инкапсуляции логики создания конкретных классов метрических коллекторов на основе решений во время выполнения. Заводской шаблон упрощает процесс добавления новых типов метрических коллекционеров без нарушения существующего кода, предоставляя архитектуру подключаемости и игры, где можно плавно ввести новые метрики. Он также помогает поддерживать разделение проблем, поскольку процесс создания метрических объектов выделяется из основной логики сбора метрической сбора.
Используя эти модели проектирования, CK эффективно управляет сложностью и гарантирует, что структура остается надежной, адаптируемой и простым в расширении, когда появляются новые требования и метрические типы.
Вам нужно, по крайней мере, Java 8, чтобы иметь возможность компилировать и запустить этот инструмент.
Чтобы использовать последнюю версию (которую вы должны), клонируйте проект и создайте банку. Простой mvn clean compile package генерирует для вас один файл JAR (см. В вашей целевой папке).
Затем просто беги:
java -jar ck-x.x.x-SNAPSHOT-jar-with-dependencies.jar
<project dir>
<use jars:true|false>
<max files per partition:0=automatic selection>
<variables and fields metrics?:true|false>
<output dir>
[ignored directories...]
Project dir относится к каталогу, где CK может найти весь исходный код, который будет проведен. CK будет рекурсивно искать файлы .java. CK может использовать зависимости проекта в качестве повышения его точности. Параметры use jars сообщают CK искать любые файлы .jar в каталоге и использовать их для лучшего разрешения типов. Max files per partition сообщают JDT размер партии для обработки. Давайте решим это для вас и начнем с 0; Если возникают проблемы (то есть вне памяти), вы думаете о настройке. Variables and field metrics указывают на CK, хотите ли вы метрики на уровне переменных и поля. Они очень мелкозернистые и производят много производства; Вы должны пропустить его, если вам нужны только метрики на уровне класса или метода. Наконец, output dir См. Каталог, где CK будет экспортировать файл CSV с метриками из проанализированного проекта. При желании вы можете указать любое число игнорируемых каталогов, разделенных пространствами (например, build/ ). По умолчанию .git и все другие скрытые папки игнорируются.
Инструмент будет генерировать три файла CSV: класс, метод и уровни переменной.
Учитесь по примеру. Смотрите класс Runner.java .
Смотрите самую последнюю версию библиотеки в значке в начале этого чтения, или по адресу https://mvnrepository.com/artifact/com.github.mauricioaniche/ck.
Используйте следующий фрагмент в вашем pom.xml. Обновление xyz с самой последней версией инструмента (проверьте mvnrepository.com или значок в начале этого файла readme):
<!-- https://mvnrepository.com/artifact/com.github.mauricioaniche/ck -->
<dependency>
<groupId>com.github.mauricioaniche</groupId>
<artifactId>ck</artifactId>
<version>X.Y.Z</version>
</dependency>
Вы также можете использовать плагин CK Maven, разработанный @jazzmuesli, который автоматически запускает CK в вашем проекте. Очень полезно для разработчиков: https://github.com/jazzmuesli/ck-mvn-plugin.
Этот инструмент использует библиотеку Eclipse JDT Core под капюшоном для конструкции AST. В настоящее время версия соответствия установлена на Java 11.
Нужна поддержка более новой языковой версии? Процесс добавления его очень прост, учитывая вклад в PR:
pom.xml . Вы можете использовать браузер репозитория, такой как репозиторий MVN, чтобы облегчить этот процесс.pom.xml обновите свойства source и target плагина компилятора Maven соответственно.CK.java : [...]
ASTParser parser = ASTParser.newParser(AST.JLS11);
[...]
JavaCore.setComplianceOptions(JavaCore.VERSION_11, options);
[...]
Потому что инструмент был рожден, чтобы просто рассчитать CK ClassLevelmetrics, но он вышел за рамки моих ожиданий ... жизнь - это смешная!
Пожалуйста, используйте следующую запись Bibtex:
@manual{aniche-ck,
title={Java code metrics calculator (CK)},
author={Maurício Aniche},
year={2015},
note={Available in https://github.com/mauricioaniche/ck/}
}
Просто отправьте PR! :)
Это программное обеспечение лицензировано по лицензии Apache 2.0.