21

他のコードに似たコードを見つける方法を知っている人はいますか?

関数やコードフラグメントを書くことがよくありますが、以前にそのようなものを書いたことがあるので、以前の実装を再利用したいと思いますが、プレーンテキスト検索を使用しても、変数名を使用しなかったため、何も表示されません。まったく同じである。

同様のコードフラグメントがあると、不要なコードの重複が発生しますが、コードベースが大きい場合、すべてのコードをメモリに保持することは不可能です。機能の点で「類似」しているコードとマークされたフラグメントまたは関数の分析を実行するツールはありますか?

次の例を検討してください。

  float xDistance = 0, zDistance = 0;
  if (camPos.X()<xgMin) xDistance = xgMin-camPos.X();
  if (camPos.X()>xgMax) xDistance = camPos.X()-xgMax;
  if (camPos.Z()<zgMin) zDistance = zgMin-camPos.Z();
  if (camPos.Z()>zgMax) zDistance = camPos.Z()-zgMax;
  float dist = sqrt(xDistance*xDistance+zDistance*zDistance);

  float distX = 0, distZ = 0;
  if (cPos.X()<xgMin) distX = xgMin-cPos.X();
  if (cPos.X()>xgMax) distX = cPos.X()-xgMax;
  if (cPos.Z()<zgMin) distZ = zgMin-cPos.Z();
  if (cPos.Z()>zgMax) distZ = cPos.Z()-zgMax;
  float dist = sqrt(distX*distX +distZ*distZ);

私には、これはすでに何度か質問され、回答されているようです。

https://stackoverflow.com/questions/204177/what-tool-to-find-code-duplicates-in-c-projects

開発中にコードの重複を検出する方法は?

ここで複製として閉じることをお勧めします。


実際、これはより一般的な検索の問題だと思います。たとえば、StackOverflowで質問が既に行われている場合、どうすれば検索できますか?

4

3 に答える 3

11

Simianを使用できます。これは、Java、C#、C ++、XML、およびその他多くの(プレーンなtxtファイルでさえ)重複コードを検出するツールです。CruiseControlのようなツールにもうまく統合できます。

于 2009-04-02T13:43:57.037 に答える
3

私たちのCloneDRは、大規模なソースシステム全体で、言語構文によってパラメーター化された重複コード(正確なコピーとニアミスの両方)を検出します。Java、C#、COBOL、C ++、PHP、Python、その他多くの言語をサポートしています。

これは、「クローンとは何ですか?」を定義するためのいくつかのパラメーターを受け入れます。これには、次のものが含まれます。クローンサイズ(3が適切な選択になる傾向があります)c)パラメーターの数(テキストへの明確な変更; 5が適切な選択になる傾向があります)これらの設定では、処理するすべてのものに10〜15%の冗長コードが見つかる傾向があります。

Simianなどの行指向のクローン検出ツールは、再フォーマットされたクローンコードを見つけることができませんが、CloneDRは見つけることができます。彼らは、コードの2つのブロックが一致すると言うかもしれませんが、通常、それらがどのように一致するか、または違いがどこにあるかを正確に示しません。CloneDRはそうします。複製されたコードを抽象化する方法を提案していません。CloneDRはそうします。

マッチングアルゴリズムが弱いため、誤検知が多くなる傾向があります。100万行にわたって5000のクローンが報告される場合、誤検知の数は非常に重要です。

あなたの例に基づいて、これらの2つのフラグメント(どちらかを指す必要はありません)が見つかると思います。変数名を抽象化すると、それらは類似していることに注意してください。

于 2009-08-23T05:57:21.880 に答える
-1

これは、私が見たコード クローン検出に関する最高のコレクションです。

https://web.archive.org/web/20120502162147/http://students.cis.uab.edu/tairasr/clones/literature

多くのプログラムがありますが、どれも最高または最も人気があるようには見えません. 自分にとって何が最も重要かを考え、ニーズに合ったものを見つけることができます。

于 2012-12-15T21:05:26.493 に答える