2009-04-02 10 views
19

Hat jemand ein Werkzeug oder eine empfohlene Übung, um ein Stück Code zu finden, der einem anderen Code ähnlich ist?Wie finden Sie ein ähnliches Codefragment?

Oft schreibe ich eine Funktion oder ein Codefragment und ich erinnere mich, dass ich schon so etwas geschrieben habe, und ich möchte die vorherige Implementierung wiederverwenden, aber die Verwendung der Nur-Text-Suche ergibt nichts, da ich das nicht verwendet habe Variablennamen, die genau gleich wären.

Ähnliche Codefragmente führen zu unnötiger Codeverdopplung, jedoch ist es bei einer großen Codebasis unmöglich, den gesamten Code im Speicher zu behalten. Gibt es irgendwelche Werkzeuge, die eine Analyse des Codes durchführen würden und markierte Fragmente oder Funktionen, die hinsichtlich der Funktionalität "ähnlich" sind?

Betrachten Sie folgende Beispiele:

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); 

und

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); 

Es scheint mir, dies wurde bereits gestellt und beantwortet mehrmals:

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

How to detect code duplication during development?

Ich schlage vor, Schließen als Duplikat hier.


Eigentlich finde ich es eine allgemeinere Suche Problem ist, wie: Wie suche ich, ob die Frage bereits auf Stackoverflow gefragt wurde?

+0

Verwandte Frage - http://stackoverflow.com/questions/2490884/why-is-copy-and-paste-of-code-dangerous – Oded

+0

mögliche Duplikate von [Wie Code-Duplizierung während der Entwicklung zu erkennen?] (Http: //stackoverflow.com/questions/191614/how-to-detect-code-duplication-during-development) – Suma

Antwort

10

Sie können Simian verwenden. Es ist ein Werkzeug, das doppelten Code in Java, C#, C++, XML und vielen mehr erkennt (sogar einfache TXT-Dateien). Es kann sogar in ein Tool wie CruiseControl integriert werden.

3

Unser CloneDR findet doppelten Code, sowohl exakte Kopien als auch Beinahe-Fehler, über große Quellsysteme, die durch die Syntax von langauge parametrisiert sind. Es unterstützt Java, C#, COBOL, C++, PHP, Python und viele andere Sprachen.

Er akzeptiert eine Reihe von Parametern zu definieren, einschließlich „Was für ein Klon ist?“: a) Similarilty Schwelle, Controlling, wie ähnlich zwei Codeblöcke müssen als Klone deklariert werden (typischerweise 95% gut) b) Anzahl der Zeilen minimale Clone-Größe (3 ist eine gute Wahl) c) Anzahl der Parameter (deutliche Änderungen am Text; 5 ist eine gute Wahl) Mit diesen Einstellungen neigt es dazu, 10- 15% redundanter Code in virtuell alles, was es verarbeitet.

Zeilenorientierte Klon-Erkennungs-Tools wie Simian können den geklonten Code nicht finden, der wurde neu formatiert, aber CloneDR wird. Sie können sagen, dass zwei Codeblöcke übereinstimmen, , aber sie zeigen Ihnen normalerweise nicht genau, wie sie übereinstimmen oder wo die Unterschiede sind; CloneDR wird. Sie schlagen nicht vor, wie man den geklonten Code abstrahiert; CloneDR wird.

Aufgrund der schwächeren übereinstimmenden Algorithmen neigen sie dazu, mehr falsche Positive zu produzieren; Wenn Sie 5000 Klone erhalten, die über eine Million Zeilen gemeldet wurden, spielt die Anzahl der falsch positiven Ergebnisse eine große Rolle.

Basierend auf Ihrem Beispiel, würde ich erwarten, dass es diese beiden Fragmente finden (Sie haben keinen Punkt auf beide) und beachten Sie, dass sie ähnlich sind, wenn Sie die Variablennamen abstrahieren.

0

Es passiert, dass meine Dissertation über das Aufspüren ähnlicher Code-Fragmente ging.

Hier ist die beste Seite, die ich gefunden habe. Viel Literatur, Tools, Links:

http://students.cis.uab.edu/tairasr/clones/literature/

Im Allgemeinen gibt es viele Programme, aber keiner von ihnen scheint die beste oder die beliebtesten zu sein. Sie müssen definieren, was für Sie am wichtigsten ist und die verfügbaren Tools durchsuchen ... oder einige Artikel lesen und Ihr eigenes Tool schreiben, das am besten zu Ihnen passt. Wenn Sie einen guten Klondetektor schreiben, können Sie ihn als Eclipse-Plugin portieren und für viele Leute nützlich sein. Keiner der Plugins hat in letzter Zeit eine dominierende Position, also kannst du derjenige sein.