2016-11-25 13 views
5

と同様の Java/Javascriptのコードを見つけるためのツールを探しています。私は "類似の"の正確な定義を言うことはできませんが、私はツールが十分にスマートであり、コードをリファクタリングするアドバイスを与えたいと思います。例えば、5つのメソッドが同じメソッド名、引数、および両方のクラスに現れる類似の実装を持っている場合)、これらの類似メソッドを基本クラスに移動するようアドバイスする必要があります。
(2)クラスAは異なる場所に複数回同じコード行を持ちますが、これらの類似したコード行を1つのメソッドに移動するようアドバイスしてください。Java/Javascriptのための同様の重複したソースコードを見つけるための自動リファクタリングツール?

私はPMDを試しましたが、重複したコード行を見つけることができましたが、十分に巧妙ではありません。それは、と同様ののソースコードが広く私のプロジェクトに広がっていることが分かりませんでした。

このようなツールはありますか?

+0

afaik PMDには、それが受け入れる類似度を定義するオプションがあります。これらを試しましたか? – mtraut

+0

IDEAは上司です! – opticyclic

答えて

1

あなたは間違いなくsimianを見ることができます。
私が知る限り、それは多かれ少なかれビルドサーバーで使用可能です。
コマンドラインで実行したり、antのようなローカルビルドツール内で統合することもできます。

複数のオプションを使用して、複製を識別するために必要な行の数を設定することができます。最高のものではない唯一のものは、生成された出力(xml)IMHOですが、これも設定可能だと思います。

これが役に立ちますようお願いいたします。


EDIT:PMDは確かに非常に優れたツールであり、おそらくシミアンと一緒に使用しようとします。 PMDはプラグインとしてIDEやエディタに統合することも非常に有効です。

2

私たちのCloneDRツールは、パーサーからの抽象構文木を比較することによって重複したコードを見つけます。 (JavaやJavaScriptを含む多くの言語の言語固有のバージョンが付属しています)。

これは、フォーマットの変更やクローンのボディの変更にもかかわらずクローンコードを見つけることができることを意味します。どちらもクローン作成中によく行われます。このよう表現宣言機能、とさえクラスとしてクローンマッチ言語の概念を発見しました。同様のクローンが、相違点/変異点と共に提案されたパラメーターとして報告される。

複数のインスタンスを持つクローンセットを見つけることができます(複数のアプリケーションには1ビットのコードの何百ものクローンがあります)。多くのソースファイルのクローンを見つけることができます。

人が直接読むことができるHTMLレポートと、他の下流のツールで処理できるXMLレポートを生成します。 (リンクを介していくつかのサンプルHTMLレポートを見ることができます)。

類似性は、定義が難しいであり、実際にはさまざまな方法で定義できます。CloneDRは、クローンセット全体の同一要素(技術的にはASTノード)とクローンセット全体の要素の合計数を比として定義します。この比率は0と1の間の値で、しきい値と比較されます。私たちは、報告されたクローンの品質に関して、95%が驚くほど頑強であることを見出しました。

興味のあるクローンの最小サイズを設定すると便利です。 a*bx*y(2パラメータ)のクローンですが、小さすぎるため報告するのには役立ちません。 CloneDRは、「行数」と呼ばれるサイズしきい値も使用しますが、要素内のクローンのサイズをコードベース全体の行あたりの平均要素数で割ったものです。これは通常、しきい値よりも多くの行を持つクローンを生成しますが、行内にある膨大な式のクローンを見つけることになります。私たちは、報告されたクローン品質に関して5-6の「系統」もかなり堅牢であることを見出しました。

この表は、CloneDRのASTマッチングアプローチが、他の多くのクローン検出ツールと比較してどの程度効果的であるかを示しています。近くに来るのはCCDIMLだけです...。これはCloneDRアプローチの学術的再実装です。より効果的に散らばっているクローンを検出できる他のアプローチ(すなわちPDGベースのアプローチ)がありますが、実際には私の個人的な経験では、コードをクローンする人々はクローンの部分をそれらを散らす;彼らはあまりにも怠惰です。 YMMV。

enter image description here

[から表:ロイ、Cordy、Koschke:コードクローン検出技術とツールの比較と評価:質的アプローチ、コンピュータプログラミング、74巻7号、月の科学、2009本論文スケッチ多くの異なるクローンの検出手法とその有効性を評価する。】

[PMDが記載されているが、apparantlyラビン - カープ文字列マッチングを使用していない、むしろASTマッチングよりも、上記の表によれば、「テキストベース」。]

再OPの要件:

の場合は、のメソッドが異なるクラスで異なる順序で発生する場合、CloneDR(実際に私が知っているツールはありません)は、複数のメソッドにわたって同様のメソッドのセットを検出しません。この場合、CloneDRは個々のメソッドをクローンとして報告する可能性が高くなります。正味の結果は同じです。あるクラスのボディが別のクラスのボディから別のクラスのボディにコピーされたときに起こるように、メンバーが異なるクラスで同じ順序で逐次的に発生した場合、そのようなセットが見つかります。

複数のメソッドにまたがる同様のコードブロックがかなり一般的に検出されます。生成されたレポートは、類似したコードブロックがどのように関連しているかを示します。抽象化されたバージョンのコードは、本質的にメソッド本体に必要なパラメータ化されたコードブロックです。

1

私は以前にIntelliJ IDEAを使用していませんでしたが、私はそれがulimateエディションでAnalyzing Duplicatesをサポートしていることを発見しました。

関連する問題