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許可證獲得許可的。