CK通过静态分析计算Java项目中的类和方法级代码指标(即无需编译代码)。目前,它包含大量指标,包括著名的CK:
CBO(对象之间的耦合) :计算一类依赖项的数量。工具检查整个类中使用的任何类型(字段声明,方法返回类型,可变声明等)。它忽略了对Java本身的依赖性(例如Java.lang.String)。
CBO修改(对象之间的耦合) :计算类依赖项的数量。它与CKTool的原始CBO非常相似。但是,该度量标准将类别的依赖性视为类型对他人的参考,又是其从其他类型中获得的参考。
粉丝:计算一类具有参考特定类的类的输入依赖项数量。例如,给定X类,X的粉丝将是通过将其引用为属性来调用X的类数,访问其某些属性,调用其某些方法,等等。
粉丝出口:计算一类具有特定类引用的其他类的输出依赖性数量。换句话说,给定X类,X的粉丝是X通过属性引用,方法调用,对象实例等的类数量。
DIT(深度继承树) :它计算一类具有“父亲”的数量。所有课程至少有1个(每个人都继承Java.lang.Object)。为了实现它,必须在项目中存在类(即如果类取决于依赖jar/dependenty文件中的x,而x取决于其他类,则将DIT计为2)。
NOC(儿童数) :它计算特定类具有的即时子类的数量。
字段数:计数字段数。静态,公共,私人,受保护,默认,最终和同步字段总数的特定数字。
方法数:计算方法数。方法,静态,公共,抽象,私人,受保护,默认,最终和同步方法的总数。构造函数方法在这里也很重要。
可见方法的数量:计算可见方法的数量。如果不是私有的,则可以看到一种方法。
NOSI(静态调用次数) :计算静态方法的调用数量。它只能计算JDT可以解决的问题。
RFC(班级的响应) :计算类中唯一方法调用的数量。由于通过静态分析解决了调用,因此当方法的过载具有相同数量的参数但类型不同时,此实现会失败。
WMC(重量方法类)或McCabe的复杂性。它计算课堂中分支指令的数量。
LOC(代码行) :它计算计数线,忽略空行和注释(即,代码的源行或sloc)。这里的行数可能与原始文件有所不同,因为我们使用JDT的内部表示源代码来计算它。
LCOM(方法缺乏凝聚力) :计算LCOM度量。这是第一个标准版本,这是不可靠的。 LCOM-HS可以更好(希望您会向我们发送拉动请求)。
LCOM*(方法缺乏凝聚力) :此度量标准是CK工具中实现的LCOM的当前版本的修改版本。 LCOM*是一个归一化的度量标准,它计算在0到1范围内的类缺乏级数。然后,越接近1个类中LCOM*的值,该类别的凝聚力越小。较接近0的lcom*的值,这是该类别的最高内聚力。该实现遵循[1]中定义的LCOM*的第三版。
TCC(紧密的类内聚力) :测量值范围为0到1的类的凝聚力。TCC通过可见方法,两种方法或其调用树之间的直接连接来测量类的内聚力,访问同一类变量。
LCC(宽松的类凝聚力) :与TCC相似,但进一步包括可见类之间的间接连接数量以进行内聚力计算。因此,约束LCC> = TCC始终保持。
回报量: return说明的数量。
循环的数量:循环数量(即,为,而又增强)。
比较数量:比较数(即,==和!=)。注意:!=仅在0.4.2+中可用。
尝试/捕获的数量:尝试/捕获的数量
括号表达式的数量:括号内表达式的数量。
字符串文字:字符串文字的数量(例如"John Doe" )。重复的字符串与出现一样多次。
数量:数量:数量(即,int,长,双,浮点)文字数量。
数学操作的数量:数学操作的数量(时间,划分,剩余,再加上,负,左屎,右移)。
变量的数量:声明变量的数量。
最大嵌套块:嵌套在一起的最高数量。
匿名类,内部类和lambda表达式的数量:这个名字说明了一切。请注意,每当声明匿名类或内部类时,它就会成为“全新类”,例如,CK生成AB和AB $ C,C,C,C是AB内部的内部类,但是,Lambda表达式不被视为类,因此是它们嵌入其中的类/方法的一部分。 A class or a method only has the number of inner classes that are declared at its level, eg, an inner class that is declared inside a method M2, that is inside an anonymous class A, that is declared inside a method M, that finally is declared inside a class C, will not count in class C, but only in method M2 (first-level method it is embodied), and anonymous class A (first-level class it is embodied).
唯一单词的数量:源代码中的唯一单词数量。在方法级别,它仅将方法主体用作输入。在班级级别,它将整个课程用作指标。该算法在删除Java关键字后基本上计算方法/类中的单词数。名称是根据骆驼盒和下划线拆分的(例如,longname_likethis成为四个单词)。有关实现的详细信息,请参见WordCounter类。
日志语句的数量:源代码中的日志语句数量。计数使用与SLF4J和Log4J API调用兼容的Regex。有关更多信息,请参见NumberOfLogStatements.java和测试示例( NumberOfLogStatementsTest和fixtures/logs )。
有Javadoc :布尔值指示一种方法是否具有Javadoc。 (目前仅在方法级)
修饰符:类/方法的公共/摘要/私人/保护/本机修饰符。可以使用org.eclipse.jdt.core.dom.Modifier解码。
每个变量的用法:每个方法内使用每个变量的频率。
每个字段的用法:每种方法内使用每个本地字段的频率,本地字段是类中的字段(不包括子类)。还检测到间接的本地字段使用情况,间接的本地字段用法包括一类的本地调用树中的所有字段用法,例如A调用B和B使用字段A,然后A间接使用A。
方法调用:所有直接调用方法,变化是局部调用和间接的本地调用。
注意:CK将类,内部类和匿名类分开。 LOC是唯一与其他指标完全不完全隔离的度量标准,例如,如果A的声明为B类B,则LOC(A)= 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 。通过精心策划指标收集过程,它在CK框架中起着关键作用。 MetricsExecutor协调Java源文件的抽象语法树(AST)的创建,这对于分析和提取代码指标至关重要。指标:该公用事业类位于ck.utils中,在CK框架内的度量集合类别的动态识别和实例化中起着至关重要的作用。它针对从metrics软件包实现ClassLevelMetric和MethodLevelMetric接口的类。
MetricsFinder利用Reflections库在运行时扫描和加载指标收集器类,这使CK系统可以扩展并适应新指标,而无需对核心体系结构进行修改。此功能对于将自定义指标集成到无缝的分析过程中特别有用。
CKVisitor: CKVisitor的一个不可或缺的组成部分,扩展了Eclipse JDT(Java Development Tools)库提供的ASTVisitor类,从Java源代码的抽象语法树(AST)直接从Java源代码启用详细的分析和指标收集。
访问者旨在遍历AST的各种节点,例如类型和方法,并在每个节点上应用特定的动作。它有效地管理了类和方法的基于堆栈的层次结构,从而可以在当前节点的范围的上下文中计算和收集指标。
CKASTVISITOR:由ck.metrics中的公制类实现,允许每个度量标准处理特定的AST节点,例如方法调查和类实例创建。
classLevlevelmetric和Methodlevelemmetric:分别定义用于收集类级和方法级指标的方法。
CKNotifier界面广播结果。CKClassResult和CKMethodResult 。CK框架结合了许多完善的设计模式,以增强其代码库的模块化,扩展性和可维护性。这些模式使框架能够有效处理复杂的操作,例如遍历抽象语法树(AST),收集指标并通知结果。以下是使用的关键设计模式:
访问者模式: CKVisitor和CKASTVisitor接口实现了访问者模式,该模式在处理各种AST节点的操作方面至关重要,而无需更改其操作的元素类别。这种模式在组件需要在AST节点的类层次结构上执行独特和无关的操作的情况下尤其有益。它通过将操作逻辑外部化到访问者对象,简化代码,从而在不修改现有节点类的情况下轻松添加新操作。这种关注的分离导致了更可维护和可扩展的代码库,其中AST节点结构和对它们的操作被解耦。
Notifier模式: CK通过使用CKNotifier采用了通知模式,该模式是将指标收集结果广播到所有注册观察者的中心机制。这种模式对于创建一个松散耦合的体系结构至关重要,该体系结构(度量计算过程)独立于其观察者(结果处理器或报告生成器)。这使得CK能够通知多个组件,以无需与特定组件耦合,这可以增强系统的灵活性和可扩展性。
工厂模式:公制收集器的实例化由MetricsFinder基于体现工厂模式的指标。该模式用于封装基于运行时决策实例化特定度量收集器类的逻辑。工厂模式简化了添加新类型的公制收集器的过程,而不会干扰现有代码,从而提供了可以无缝介绍新指标的插件体系结构。它还有助于维持关注点的分离,因为创建度量对象的过程与公制收集的核心逻辑隔离。
通过利用这些设计模式,CK有效地管理了复杂性,并确保框架保持强大,适应性且易于扩展,并且随着新需求和度量类型的出现。
您至少需要Java 8才能编译和运行此工具。
要使用最新版本(您应该使用),请克隆项目并生成一个JAR。简单的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或此读数文件开头的徽章):
<!-- https://mvnrepository.com/artifact/com.github.mauricioaniche/ck -->
<dependency>
<groupId>com.github.mauricioaniche</groupId>
<artifactId>ck</artifactId>
<version>X.Y.Z</version>
</dependency>
您还可以使用由@JazzMuesli开发的CK Maven插件,该插件会在项目中自动运行CK。对开发人员非常有用:https://github.com/jazzmuesli/ck-mvn-plugin。
该工具在引擎盖下使用Eclipse的JDT核心库进行AST构造。当前,合规性版本设置为Java 11。
需要支持新语言版本吗?考虑到PR:添加它的过程非常简单。
pom.xml文件中更新Eclipse JDT核心依赖关系。您可以使用像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/}
}
只需提交公关! :)
该软件是根据Apache 2.0许可证获得许可的。