私たちのCloneDRツールは、パーサーからの抽象構文木を比較することによって重複したコードを見つけます。 (JavaやJavaScriptを含む多くの言語の言語固有のバージョンが付属しています)。
これは、フォーマットの変更やクローンのボディの変更にもかかわらずクローンコードを見つけることができることを意味します。どちらもクローン作成中によく行われます。このよう表現、宣言、文、機能、とさえクラスとしてクローンマッチ言語の概念を発見しました。同様のクローンが、相違点/変異点と共に提案されたパラメーターとして報告される。
複数のインスタンスを持つクローンセットを見つけることができます(複数のアプリケーションには1ビットのコードの何百ものクローンがあります)。多くのソースファイルのクローンを見つけることができます。
人が直接読むことができるHTMLレポートと、他の下流のツールで処理できるXMLレポートを生成します。 (リンクを介していくつかのサンプルHTMLレポートを見ることができます)。
類似性は、定義が難しいであり、実際にはさまざまな方法で定義できます。CloneDRは、クローンセット全体の同一要素(技術的にはASTノード)とクローンセット全体の要素の合計数を比として定義します。この比率は0と1の間の値で、しきい値と比較されます。私たちは、報告されたクローンの品質に関して、95%が驚くほど頑強であることを見出しました。
興味のあるクローンの最小サイズを設定すると便利です。 a*b
はx*y
(2パラメータ)のクローンですが、小さすぎるため報告するのには役立ちません。 CloneDRは、「行数」と呼ばれるサイズしきい値も使用しますが、要素内のクローンのサイズをコードベース全体の行あたりの平均要素数で割ったものです。これは通常、しきい値よりも多くの行を持つクローンを生成しますが、行内にある膨大な式のクローンを見つけることになります。私たちは、報告されたクローン品質に関して5-6の「系統」もかなり堅牢であることを見出しました。
この表は、CloneDRのASTマッチングアプローチが、他の多くのクローン検出ツールと比較してどの程度効果的であるかを示しています。近くに来るのはCCDIMLだけです...。これはCloneDRアプローチの学術的再実装です。より効果的に散らばっているクローンを検出できる他のアプローチ(すなわちPDGベースのアプローチ)がありますが、実際には私の個人的な経験では、コードをクローンする人々はクローンの部分をそれらを散らす;彼らはあまりにも怠惰です。 YMMV。
[から表:ロイ、Cordy、Koschke:コードクローン検出技術とツールの比較と評価:質的アプローチ、コンピュータプログラミング、74巻7号、月の科学、2009本論文スケッチ多くの異なるクローンの検出手法とその有効性を評価する。】
[PMDが記載されているが、apparantlyラビン - カープ文字列マッチングを使用していない、むしろASTマッチングよりも、上記の表によれば、「テキストベース」。]
再OPの要件:
の場合は、のメソッドが異なるクラスで異なる順序で発生する場合、CloneDR(実際に私が知っているツールはありません)は、複数のメソッドにわたって同様のメソッドのセットを検出しません。この場合、CloneDRは個々のメソッドをクローンとして報告する可能性が高くなります。正味の結果は同じです。あるクラスのボディが別のクラスのボディから別のクラスのボディにコピーされたときに起こるように、メンバーが異なるクラスで同じ順序で逐次的に発生した場合、そのようなセットが見つかります。
複数のメソッドにまたがる同様のコードブロックがかなり一般的に検出されます。生成されたレポートは、類似したコードブロックがどのように関連しているかを示します。抽象化されたバージョンのコードは、本質的にメソッド本体に必要なパラメータ化されたコードブロックです。
afaik PMDには、それが受け入れる類似度を定義するオプションがあります。これらを試しましたか? – mtraut
IDEAは上司です! – opticyclic