コードの重複検出には CPD ツールを使用しています。CPD ツールには空白とコメントが含まれます。重複の正しいケースが発生するように、空白やコメントを回避する方法を教えてください。4 行の重複コードと 4 行のコメントがあるとすると、4 行ではなく 8 行が返されます。
1 に答える
特定の (コピー/貼り付け検出器) CPD ツールはどれですか? 沢山あります。
CPD が重複を検出する方法は、比較するプリミティブ エンティティによって異なります。(私はクローン検出器を構築しました)。
ソース行でのみ動作するものもあります。これらは、ツールに与えたと思われるプログラミング言語から空白とコメントを区別することはほとんどできません。それにとって、あなたのコードは単なる生のテキストです。また、これらのツールは、「コード ブロック A がコード B の複製であり、定期的な変更 (パラメーターなど) がある」ことを検出することもできません。これは、本当に知りたいことです。(この種のCPDはひどい答えを出すと思います。したがって、あなたの質問ですが、すべてに対応しているという利点があります)。
たまたま知っている言語のために、言語トークンで動作するものもあります。これらのツールは、空白を無視するのに非常に優れている傾向があります。彼らはコメントが特定の種類のトークンであることを知っているため、通常、何らかのコマンド ライン スイッチを使用してコメントを無視することもできます。(したがって、「どの CPD ツールですか?」)。しかし、彼らは言語構造を理解していないため、そのシーケンスは
} {
他のすべてのそのようなシーケンスのクローンです。率直に言って、それは愚かなクローンです。第 2 に、このようなトークンベースの検出器は、1 つのトークン幅のパラメーター (クローンが体系的に変化する場所) のみを検出できます。通常、識別子または定数だけを別の定数または識別子に置き換えます。それでも、これは、ライン指向の CPD ツールからの使いやすさの大きな進歩です。
たとえば、言語の文法を使用してマッチングを制御するなど、言語構造に作用するものはほとんどありません (私はたまたまこれらの 1 つ、CloneDR を作成しました。経歴を参照してください)。これらはトークンベースの CPD ツールの間違いを犯すことができないため、より適切に検出されたクローンを取得できます。さらに、トークンの (構造化された) シーケンスで構成されるパラメーターを検出できます。おっと、意見!) これらは、はるかに優れたクローンを検出します (これが、CloneDR を構築する理由です)。