2009-04-02 14 views
19

Qualcuno ha qualche strumento o qualche pratica raccomandata su come trovare un pezzo di codice simile ad un altro codice?Come trovare un frammento di codice simile?

Spesso scrivo una funzione o un frammento di codice e ricordo di aver già scritto qualcosa del genere prima, e vorrei riutilizzare l'implementazione precedente, tuttavia l'uso della ricerca in testo semplice non rivela nulla, poiché non ho usato il nomi variabili che sarebbero esattamente gli stessi.

Avere frammenti di codice simili porta a una duplicazione di codice non necessaria, tuttavia con una base di codice estesa è impossibile mantenere tutto il codice in memoria. Esistono strumenti che potrebbero eseguire analisi del codice e frammenti o funzioni contrassegnati che sono "simili" in termini di funzionalità?

considerare i seguenti esempi:

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

e

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

Mi sembra che sia già stato chiesto e ha risposto più volte:

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

How to detect code duplication during development?

Suggerisco di chiudere come duplicato qui.


In realtà penso che sia un problema di ricerca più generale, come: Come faccio a cercare se la questione è stata già chiesto in StackOverflow?

+0

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

+0

possibile duplicato di [Come rilevare la duplicazione del codice durante lo sviluppo?] (Http: //stackoverflow.com/questions/191614/how-to-detect-code-duplication-during-development) – Suma

risposta

10

È possibile utilizzare Simian. È uno strumento che rileva il codice duplicato in Java, C#, C++, XML e molti altri (anche file txt semplici). Si integra perfettamente anche in uno strumento come CruiseControl.

3

Il nostro codice CloneDR trova il codice duplicato, sia copie esatte che near-miss, su sistemi di origine di grandi dimensioni, parametrizzati dalla sintassi di langauge. Supporta Java, C#, COBOL, C++, PHP, Python e molti altri linguaggi.

Si accetta una serie di parametri per definire, tra cui "Che cosa è un clone?": a) la soglia Similarilty, controllando il modo in simili due blocchi di codice devono essere essere dichiarate come cloni (di solito il 95% è buono) b) numero di righe dimensione minima del clone (3 tende ad essere una buona scelta) c) numero di parametri (modifiche distinte al testo, 5 tende ad essere una buona scelta) Con queste impostazioni, tende a trovare 10- 15% di codice ridondante in virgola mobile tutto ciò che viene elaborato.

Strumenti di rilevamento di cloni orientati alla linea come Simian non possono trovare codice clonato che è stato riformattato, ma CloneDR lo farà. Possono dire che due blocchi di codice corrispondono, ma di solito non mostrano esattamente come corrispondono o dove si trovano le differenze; CloneDR lo farà. Non suggeriscono come astrarre il codice clonato; CloneDR lo farà.

In virtù di avere gli algoritmi di corrispondenza più deboli, , tendono a produrre più falsi positivi; quando si ottengono 5000 cloni riportati su su un milione di righe, il numero di falsi positivi è molto importante.

In base a tuo esempio, mi aspetto che per trovare quei due frammenti (non dovete avere punto da uno dei due) e si noti che essi sono simili se si astrarre i nomi delle variabili.

0

Accade che la mia tesi riguardasse la rilevazione di frammenti di codice simili.

Ecco la pagina migliore che ho trovato. Un sacco di letteratura, strumenti, link:

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

In generale ci sono molti programmi, ma nessuno di loro sembra essere il migliore o il più popolare. Devi definire ciò che è più importante per te e cercare tra gli strumenti disponibili ... o leggere alcuni documenti e scrivere il tuo strumento, adatto al meglio per te. Se scrivi un buon rilevatore di cloni, puoi portarlo come plugin di Eclipse e sarà utile per molte persone. Nessuno dei plug-in ha recentemente una posizione dominante, quindi puoi essere l'unico.