CKは、静的分析(つまり、コンパイルされたコードは必要ありません)によってJavaプロジェクトのクラスレベルとメソッドレベルのコードメトリックを計算します。現在、有名なCKを含む大規模なメトリックセットが含まれています。
CBO(オブジェクト間のカップリング) :クラスが持っている依存関係の数をカウントします。ツールは、クラス全体で使用される任意のタイプ(フィールド宣言、メソッドリターンタイプ、変数宣言など)をチェックします。 Java自体への依存関係を無視します(例:Java.lang.String)。
CBO修正(オブジェクト間の結合) :クラスが持っている依存関係の数をカウントします。 CktoolのオリジナルCBOに非常に似ています。ただし、このメトリックは、クラスからの依存関係を、タイプが他のタイプにもたらす参照と、他のタイプから受け取る参照の両方であると考えています。
ファンイン:クラスが持っている入力依存関係の数、つまり、特定のクラスを参照するクラスの数をカウントします。たとえば、クラスXを考えると、Xのファンインは、属性を参照し、属性の一部にアクセスし、メソッドの一部を呼び出すなど、Xを呼び出すクラスの数です。
ファンアウト:クラスが持っている出力依存関係の数、つまり、特定のクラスで参照される他のクラスの数をカウントします。言い換えれば、クラスXを考えると、Xのファンアウトは、属性リファレンス、メソッドの呼び出し、オブジェクトインスタンスなどを介してXによって呼ばれるクラスの数です。
DIT(深さ継承ツリー) :クラスが持っている「父親」の数をカウントします。すべてのクラスには少なくとも1つのDITがあります(誰もがjava.lang.objectを継承します)。それを実現するためには、プロジェクトにクラスが存在する必要があります(つまり、クラスがjar/依存関係ファイルに依存するxに依存し、xは他のクラスに依存し、DITは2とカウントされます)。
NOC(子供数) :特定のクラスが持っている即時のサブクラスの数をカウントします。
フィールドの数:フィールドの数をカウントします。フィールドの総数、静的、パブリック、プライベート、保護、デフォルト、最終、および同期フィールドの特定の数。
方法の数:メソッド数をカウントします。方法の総数、静的、パブリック、抽象、プライベート、保護、デフォルト、最終、および同期メソッドの特定の数。コンストラクターメソッドもここでカウントされます。
目に見える方法の数:可視方法の数をカウントします。プライベートでない場合は、メソッドが表示されます。
NOSI(静的呼び出しの数) :静的メソッドへの呼び出しの数をカウントします。 JDTによって解決できるもののみを数えることができます。
RFC(クラスの応答) :クラス内の一意の方法の呼び出しの数をカウントします。 invocationsは静的分析によって解決されるため、この実装は、メソッドが同じ数のパラメーターで過負荷になっている場合、異なるタイプの場合に失敗します。
WMC(重量メソッドクラス)またはマッケイブの複雑さ。クラス内のブランチ命令の数をカウントします。
loc(コード行) :空の行やコメントを無視して、カウントの行をカウントします(つまり、コードのソースライン、またはSLOC)。 JDTのソースコードの内部表現を使用して計算するため、ここの行の数は元のファイルとは少し異なる場合があります。
LCOM(方法の凝集の欠如) :LCOMメトリックを計算します。これはメトリックの最初のバージョンであり、信頼できません。 LCOM-HSはより良くなる可能性があります(うまくいけば、プルリクエストを送信します)。
LCOM*(メソッドの結束の欠如) :このメトリックは、CKツールに実装されているLCOMの現在のバージョンの修正バージョンです。 lcom*は、0〜1の範囲内でクラスの凝集の欠如を計算する正規化されたメトリックです。その後、クラスでは1に近いlcom*の値に近いほど、このクラスの結束度は少なくなります。クラスのLCOM*の値が0に近いほど、このクラスの凝集は最も多くなります。この実装は、[1]で定義されているLCOM*の3番目のバージョンに従います。
TCC(タイトクラスの結束) :値の範囲のクラスの凝集を測定します。TCCは、可視方法、2つの方法、またはその呼び出しツリー間の直接接続を介してクラスの結合を測定します。
LCC(ゆるいクラスの凝集) :TCCに似ていますが、凝集計算のための可視クラス間の間接的な接続の数がさらに含まれます。したがって、制約LCC> = TCCは常に保持されます。
返品量: return手順の数。
ループの量:ループの数(つまり、for、while、while、entanced for)。
比較の量:比較数(つまり、==および!=)。注:!= 0.4.2+でのみ利用可能です。
トライ/キャッチの量:トライ/キャッチの数
括弧付きの式の量:括弧内の表現の数。
文字列リテラル:文字列リテラルの数(例: "John Doe" )。繰り返される文字列は、それらが表示されても何度もカウントされます。
数の数:数値数(すなわち、int、long、double、float)リテラル。
数学操作の量:数学操作の数(時間、分割、残り、マイナス、左のたわごと、右シフト)。
変数の量:宣言された変数の数。
最大ネストブロック:一緒にネストされたブロックの数が最も多い。
匿名のクラス、内部クラス、ラムダの表現の量:名前はすべてを示しています。匿名のクラスまたは内側のクラスが宣言されるたびに、それは「まったく新しいクラス」になる場合はいつでも、たとえばCKがABとAB $ Cを生成します。CはAB内の内部クラスであるが、ラムダ式はクラスとは見なされないため、埋め込まれているクラス/メソッドの一部であることに注意してください。クラスまたはメソッドには、メソッドM2内で宣言される内部クラス、メソッドM2、つまりクラスC内で最終的に宣言される匿名クラスA内で宣言される内部クラスのみがあります。
一意の単語の数:ソースコードの一意の単語の数。メソッドレベルでは、メソッド本体のみを入力として使用します。クラスレベルでは、クラスの全身を指標として使用します。アルゴリズムは、Javaキーワードを削除した後、基本的にメソッド/クラスの単語の数をカウントします。名前はラクダのケースと下線に基づいて分割されます(例えば、longname_likethisは4つの単語になります)。実装の詳細については、 WordCounterクラスを参照してください。
ログステートメントの数:ソースコードのログステートメントの数。カウントは、slf4jおよびlog4j API呼び出しと互換性のあるRegexを使用します。詳細については、 NumberOfLogStatements.javaおよびテストの例( NumberOfLogStatementsTestおよびfixtures/logs )を参照してください。
Javadoc :BooleanメソッドがJavadocを持っているかどうかを示すBoolean。 (今のところメソッドレベルでのみ)
修飾子:パブリック/アブストラクト/プライベート/保護/クラス/メソッドのネイティブ修飾子。 org.eclipse.jdt.core.dom.Modifierを使用してデコードできます。
各変数の使用法:各メソッド内で各変数が使用される頻度。
各フィールドの使用:各メソッド内で各ローカルフィールドが使用される頻度で、ローカルフィールドはクラス内のフィールドです(サブクラスは含まれていません)。また、間接的なローカルフィールドの使用が検出されます。間接的なローカルフィールドの使用には、クラスのローカル呼び出しツリー内のフィールドのすべての使用が含まれます。
メソッドの呼び出し:すべて直接呼び出された方法、バリエーションはローカルの呼び出しと間接的なローカルの呼び出しです。
注:CKは、クラス、内部クラス、および匿名クラスを分離します。 locは、他のメトリックではない唯一のメトリックです。たとえば、aに内部クラスbの宣言がある場合、loc(a)= loc(class A) + loc(inner class b)。
CKはJavaコードメトリックコレクションツールであり、3つの主要なパッケージを中心に展開する単純な構造に合理化されています。
簡潔にするために、このドキュメント内で、 com.github.mauricioaniche.ckなどのパッケージプレフィックスは省略されています。
CK 、メトリックコレクションプロセス全体のオーケストレーションを管理します。メトリックファインダーを初期化し、使用可能なメモリに基づいてファイルパーティションを処理し、適切な環境設定を備えたASTパーサーを設定し、異なるディレクトリとJAR依存関係の実行フローを管理します。 MetricsコレクションのJavaファイルの処理を最適化するために、 useJars 、 maxAtOnce 、 variablesAndFieldsなどのユーザー入力に基づいて動作を動的に調整します。ckパッケージに収容されているアプリケーションのエントリポイント。このクラスは、メトリックコレクションプロセスを構成および起動するコマンドライン引数を処理します。プロジェクトパスのユーザー入力、JARインクルージョン、ファイルパーティション、メトリックの詳細、および出力ディレクトリのセットアップを処理します。 Runner 、 CKクラスを初期化および利用し、結果ResultWriterを介して結果出力を処理することにより、全体的な実行を調整します。FileASTRequestor拡張します。 Metrics Collectionプロセスを調整することにより、CKフレームワークで極めて重要な役割を果たします。 MetricsExecutor 、Javaソースファイルの抽象的構文ツリー(AST)の作成を調整します。これは、コードメトリックの分析と抽出に不可欠です。MetricsFinder: ck.utilsにあるこのユーティリティクラスは、CKフレームワーク内のメトリックコレクタークラスの動的識別とインスタンス化において重要な役割を果たします。 metricsパッケージからClassLevelMetricおよびMethodLevelMetricインターフェイスを実装するクラスをターゲットにしています。
MetricsFinder 、 Reflections Libraryを使用して、実行時にメトリックコレクタークラスをスキャンおよびロードします。これにより、CKシステムは、コアアーキテクチャの変更を必要とせずに、CKシステムを新しいメトリックに拡張可能かつ適応させることができます。この機能は、カスタムメトリックを分析プロセスにシームレスに統合するのに特に役立ちます。
CKVISITOR: CKフレームワークの積分コンポーネントであるCKVisitor 、Eclipse JDT(Java Development Tools)ライブラリが提供するASTVisitorクラスを拡張し、Java Source CodeのAbstract SynTax Tree(AST)からの詳細な分析とメトリックコレクションを直接可能にします。
訪問者は、タイプや方法など、ASTのさまざまなノードを通過し、各ノードに特定のアクションを適用するように設計されています。クラスとメソッドのスタックベースの階層を効果的に管理し、現在のノードの範囲のコンテキストでメトリックを計算および収集できるようにします。
CKASTVISITOR: ck.metricsのメトリッククラスによって実装され、各メトリックがメソッドの呼び出しやクラスインスタンス作成など、特定のASTノードを処理できるようにします。
ClassLevelmetricおよびMethodlevelmetric:それぞれクラスレベルとメソッドレベルのメトリックを収集する方法を定義するインターフェイス。
CKNotifierインターフェイスを使用して結果をブロードキャストします。CKClassResultとCKMethodResultに収集されたデータを記入します。CKフレームワークには、コードベースのモジュール性、拡張性、保守性を高めるために、多くの確立された設計パターンが組み込まれています。これらのパターンにより、フレームワークは、抽象的な構文ツリー(AST)を通過する、メトリックの収集、結果への通知などの複雑な操作を効率的に処理できます。以下は、使用される重要なデザインパターンです。
訪問者パターン: CKVisitorおよびCKASTVisitorインターフェイスは、訪問者パターンを実装します。これは、動作する要素のクラスを変更することなく、さまざまなASTノードの操作を処理するのに極めて重要です。このパターンは、ASTノードのクラス階層全体でコンポーネントが明確で無関係な操作を実行する必要があるシナリオで特に有益です。操作ロジックをVisitorオブジェクトに外部に外部化することにより、コードを簡素化し、既存のノードクラスを変更せずに新しい操作を簡単に追加します。この懸念の分離は、より保守可能で拡張可能なコードベースにつながり、そこではそれらのASTノード構造と操作が分離されます。
Notifier Pattern: 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および他のすべての非表示フォルダーは無視されます。
このツールは、クラス、メソッド、および可変レベルの3つのCSVファイルを生成します。
例で学ぶ。 Runner.javaクラスを参照してください。
このREADMEの冒頭のバッジのライブラリの最新バージョン、またはhttps://mvnrepository.com/artifact/com.github.mauricioaniche/ckを参照してください。
pom.xmlで次のスニペットを使用してください。ツールの最新バージョンでXYZを更新します(この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を自動的に実行する@jazzmuesliによって開発されたCK Mavenプラグインを使用することもできます。開発者にとって非常に便利:https://github.com/jazzmuesli/ck-mvn-plugin。
このツールは、AST構造のためにフードの下にEclipseのJDTコアライブラリを使用しています。現在、コンプライアンスバージョンは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/}
}
PRを提出するだけです! :)
このソフトウェアは、Apache 2.0ライセンスの下でライセンスされています。