CK는 정적 분석을 통해 Java 프로젝트의 클래스 수준 및 메소드 수준 코드 메트릭을 계산합니다 (즉, 컴파일 된 코드가 필요하지 않음). 현재 유명한 CK를 포함한 대규모 메트릭 세트가 포함되어 있습니다.
CBO (객체 간 커플 링) : 클래스의 종속성 수를 계산합니다. 도구는 전체 클래스에 사용 된 모든 유형 (필드 선언, 메소드 리턴 유형, 변수 선언 등)을 확인합니다. Java 자체에 대한 종속성을 무시합니다 (예 : java.lang.string).
CBO 수정 (객체 간 커플 링) : 클래스의 종속성 수를 계산합니다. CKTool의 원래 CBO와 매우 유사합니다. 그러나이 메트릭은 클래스의 종속성이 유형이 다른 유형에 대한 참조와 다른 유형에서받는 참조로 간주합니다.
Fan-In : 클래스가 특정 클래스를 참조하는 클래스 수를 입력 의존성 수를 계산합니다. 예를 들어, 클래스 X가 주어지면 X의 팬인은 X를 속성으로 참조하고 일부 속성에 액세스하고 일부 방법 중 일부를 호출하여 X를 호출하는 클래스 수입니다.
팬 아웃 : 클래스가 특정 클래스에서 참조 한 다른 클래스의 수를 계산합니다. 다시 말해, 클래스 X가 주어지면 X의 팬 아웃은 속성 참조, 메소드 호출, 객체 인스턴스 등을 통해 X가 호출하는 클래스 수입니다.
dit (깊이 상속 트리) : 클래스가 가진 "아버지"의 수를 계산합니다. 모든 클래스에는 최소 1 개가 있습니다 (모든 사람은 java.lang.object를 상속합니다). 이를 수행하려면 클래스가 프로젝트에 존재해야합니다 (즉, 클래스가 JAR/의존성 파일에 의존하는 X에 의존하고 X가 다른 클래스에 의존하는 경우 DIT는 2로 계산됩니다).
NOC (어린이 수) : 특정 클래스의 즉각적인 하위 클래스 수를 계산합니다.
필드 수 : 필드 수를 계산합니다. 총 필드 수, 정적, 공개, 개인, 보호, 기본, 최종 및 동기화 된 필드에 대한 특정 숫자.
방법 수 : 방법 수를 계산합니다. 총 방법 수, 정적, 공개, 추상, 개인, 보호, 기본, 최종 및 동기화 된 방법에 대한 특정 숫자. 생성자 방법도 여기에 계산됩니다.
가시 방법의 수 : 가시 방법의 수를 계산합니다. 비공개가 아닌 경우 방법이 보입니다.
NOSI (정적 호출 수) : 정적 메소드에 대한 호출 수를 계산합니다. JDT가 해결할 수있는 것만 계산할 수 있습니다.
RFC (클래스에 대한 응답) : 클래스에서 고유 한 메소드 호출 수를 계산합니다. 정적 분석을 통해 호출이 해결되므로 메소드에 동일한 수의 매개 변수가 있지만 다른 유형의 오버로드가있는 경우이 구현이 실패합니다.
WMC (Weight Method Class) 또는 McCabe의 복잡성 . 클래스의 지 지침 수를 계산합니다.
loc (코드 라인) : 빈 줄과 주석을 무시하고 카운트 라인을 계산합니다 (즉, 코드의 소스 라인 또는 SLOC). JDT의 소스 코드 내부 표현을 사용하여이를 계산하기 때문에 여기에 줄의 수는 원래 파일과 약간 다를 수 있습니다.
LCOM (방법의 응집력 부족) : LCOM 메트릭을 계산합니다. 이것은 신뢰할 수없는 메트릭의 첫 번째 버전입니다. LCOM-HS가 더 나을 수 있습니다 (희망적으로, 우리에게 풀 요청을 보내겠습니다).
LCOM* (방법 응집력 부족) :이 메트릭은 CK 도구에서 구현 된 LCOM의 현재 버전의 수정 된 버전입니다. Lcom*은 0 ~ 1의 범위 내에서 클래스의 응집력 부족을 계산하는 정규화 된 메트릭입니다. 그런 다음, 클래스에서 Lcom의 값에 가까울수록 각 클래스의 응집력이 줄어 듭니다. 클래스에서 lcom*의 값이 0에 가까울수록,이 각 클래스의 가장 큰 응집력. 이 구현은 [1]에 정의 된 Lcom*의 세 번째 버전을 따릅니다.
TCC (Tight Class Cohesion) : 0에서 1의 값 범위를 가진 클래스의 응집력을 측정합니다. TCC는 가시 방법, 두 방법 또는 호출 트리 간의 직접 연결을 통해 클래스의 응집력을 측정합니다.
LCC (느슨한 클래스 응집력) : TCC와 유사하지만 응집력 계산을위한 가시 클래스 간의 간접 연결 수가 포함됩니다. 따라서 제약 LCC> = TCC는 항상 유지됩니다.
반품 수량 : return 지침 수.
루프의 양 : 루프 수 (즉,, 동안, 그리고, 향상).
비교의 수량 : 비교 수 (예 : == 및! =). 참고 :! =는 0.4.2+에서만 사용할 수 있습니다.
시도/어획량 : 시도/어획량 수
괄호 표현의 수량 : 괄호 안에있는 표현의 수.
문자열 리터럴 : 문자열 리터럴 수 (예 : "John Doe" ). 반복 된 문자열은 나타나는만큼 여러 번 계산됩니다.
수량 : 숫자 수 (예 : int, long, double, float) 리터럴 수.
수학 운영의 수량 : 수학 운영 수 (시간, 나누기, 나머지, 마이너스, 왼쪽 똥, 올바른 교대).
변수의 수량 : 선언 된 변수 수.
MAX 중첩 블록 : 가장 많은 수의 블록이 함께 중첩되었습니다.
익명의 수업, 내부 수업 및 람다 표현의 수량 : 이름은 모든 것을 말합니다. 익명의 클래스 나 내부 클래스가 선언 될 때마다 "완전히 새로운 클래스"가되면, 예를 들어, CK는 AB 및 AB $ C를 생성하고 C는 AB 내부의 내부 클래스가되지만 LAMBDA 표현은 클래스로 간주되지 않으므로 클래스/방법의 일부입니다. 클래스 또는 방법은 수준에서 선언되는 내부 클래스의 수를 가지고 있습니다. 예를 들어, 메소드 M2 내부에 선언 된 내부 클래스, 익명 클래스 A 내부에있는 내부 클래스는 클래스 C 내부에서 선언 된 메소드 M 내부에 선언 된 내부 클래스 (Class C) 내부에 계산되지 않고 메소드 M2에서만 계산되지 않으며 (첫 번째 클래스 A는 구체화 된).
고유 한 단어 수 : 소스 코드의 고유 단어 수. 메소드 레벨에서 메소드 본문 만 입력 만 사용합니다. 수업 수준에서는 클래스 전체를 메트릭으로 사용합니다. 알고리즘은 기본적으로 Java 키워드를 제거한 후 메소드/클래스의 단어 수를 계산합니다. 이름은 낙타 케이스와 밑줄을 기준으로 분할됩니다 (예 : longname_likethis는 네 단어가됩니다). 구현에 대한 자세한 내용은 WordCounter 클래스를 참조하십시오.
로그 문의 수 : 소스 코드의 로그 문의 수. 카운팅은 SLF4J 및 LOG4J API 호출과 호환되는 Regex를 사용합니다. 자세한 내용은 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 (class a) + loc (내부 클래스 B)의 선언이있는 경우 다른 것들과 완전히 분리되지 않은 유일한 지표입니다.
CK는 Java Code Metrics Collection Tool으로, 3 개의 기본 패키지를 중심으로 간단한 구조로 간소화되었습니다.
간결성의 경우이 문서 내에서 com.github.mauricioaniche.ck 와 같은 패키지 접두사는 생략됩니다.
CK 전체 메트릭 수집 프로세스의 오케스트레이션을 관리합니다. 메트릭 파인더를 초기화하고, 사용 가능한 메모리를 기반으로 파일 파티셔닝을 처리하고, 적절한 환경 설정을 가진 AST 파서를 설정하고, 다양한 디렉토리 및 JAR 종속성에 걸쳐 실행 흐름을 관리합니다. Metrics Collection 용 Java 파일의 처리를 최적화하기 위해 useJars , maxAtOnce variablesAndFields 와 같은 사용자 입력을 기반으로 동작을 동적으로 조정합니다.ck 패키지에 보관 된 응용 프로그램의 진입 점. 이 클래스는 명령 줄 인수를 처리하여 메트릭 수집 프로세스를 구성하고 시작합니다. 프로젝트 경로, JAR 포함, 파일 파티셔닝, 메트릭 디테일 및 출력 디렉토리 설정에 대한 사용자 입력을 처리합니다. Runner CK 클래스를 초기화하고 활용하여 결과 ResultWriter 를 통한 결과 출력을 초기화하여 전체 실행을 오케스트레이션합니다.FileASTRequestor 확장합니다. 메트릭 수집 프로세스를 조정하여 CK 프레임 워크에서 중추적 인 역할을합니다. MetricsExecutor 는 Java 소스 파일의 AST (Abstract Syntax Tree)의 생성을 조정하며 코드 메트릭을 분석하고 추출하는 데 필수적입니다. MetricsFinder : ck.utils 에 위치한이 유틸리티 클래스는 CK 프레임 워크 내에서 메트릭 수집기 클래스의 동적 식별 및 인스턴스화에 중요한 역할을합니다. metrics 패키지에서 ClassLevelMetric 및 MethodLevelMetric 인터페이스를 구현하는 클래스를 대상으로합니다.
MetricsFinder 런타임에서 Metric Collector 클래스를 스캔하고로드하기 위해 Reflections 라이브러리를 사용하여 CK 시스템을 핵심 아키텍처에 대한 수정 없이는 확장 가능하고 새로운 메트릭에 적응할 수있게합니다. 이 기능은 특히 사용자 정의 메트릭을 분석 프로세스에 원활하게 통합하는 데 유용합니다.
CKVISITOR : CK 프레임 워크의 필수 구성 요소 인 CKVisitor Eclipse JDT (Java Development Tools) 라이브러리가 제공하는 ASTVisitor 클래스를 확장하여 Java 소스 코드의 Abstract Syntax Tree (AST)에서 직접 세부 분석 및 메트릭 컬렉션을 가능하게합니다.
방문자는 유형 및 메소드와 같은 AST의 다양한 노드를 가로 지르고 각 노드에서 특정 동작을 적용하도록 설계되었습니다. 클래스 및 메소드의 스택 기반 계층 구조를 효과적으로 관리하여 현재 노드의 범위와 관련하여 메트릭을 계산 및 수집 할 수 있습니다.
CKASTVESITOR : ck.metrics 의 메트릭 클래스에 의해 구현되어 각 메트릭이 메소드 호출 및 클래스 인스턴스 크리에이션과 같은 특정 AST 관심 노드를 처리 할 수 있습니다.
ClassleVelmetric 및 MethodVelmetric : 인터페이스 각각 클래스 수준 및 메소드 수준 메트릭을 수집하는 방법을 정의합니다.
CKNotifier 인터페이스를 사용하여 결과를 방송합니다.CKClassResult 및 CKMethodResult 수집 된 데이터로 채 웁니다.CK 프레임 워크는 코드베이스의 모듈성, 확장 성 및 유지 관리 가능성을 향상시키기 위해 잘 확립 된 여러 설계 패턴을 통합합니다. 이러한 패턴을 통해 프레임 워크는 추상 구문 트리 (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 클래스를 참조하십시오.
이 readme의 시작 부분에 배지에서 가장 최근의 라이브러리 버전 또는 https://mvnrepository.com/artifact/com.github.mauricioaniche/ck를 참조하십시오.
pom.xml에서 다음 스 니펫을 사용하십시오. 최신 버전의 도구로 XYZ를 업데이트하십시오 (이 readMe 파일의 시작 부분에서 mvnrepository.com 또는 배지를 확인하십시오).
<!-- https://mvnrepository.com/artifact/com.github.mauricioaniche/ck -->
<dependency>
<groupId>com.github.mauricioaniche</groupId>
<artifactId>ck</artifactId>
<version>X.Y.Z</version>
</dependency>
또한 프로젝트에서 CK를 자동으로 실행하는 @JazzMuesli가 개발 한 CK Maven 플러그인을 사용할 수도 있습니다. 개발자에게 매우 유용합니다 : https://github.com/jazzmuesli/ck-mvn-plugin.
이 도구는 AST 구성을 위해 Eclipse의 JDT Core 라이브러리를 사용합니다. 현재 컴플라이언스 버전은 Java 11으로 설정됩니다.
새로운 언어 버전에 대한 지원이 필요하십니까? 그것을 추가하는 과정은 PR을 기여하는 것을 고려하여 매우 간단합니다.
pom.xml 파일에서 Eclipse JDT Core Dependency를 업데이트하십시오. MVN 저장소와 같은 저장소 브라우저를 사용 하여이 프로세스를 완화 할 수 있습니다.pom.xml 파일에서 Maven 컴파일러 플러그인의 source 및 target 속성을 업데이트하십시오.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 라이센스에 따라 라이센스가 부여됩니다.