Domanda

Qualcuno ha qualche strumento o di qualche pratica raccomandata come trovare un pezzo di codice che è simile a qualche altro codice?

Spesso scrivo una funzione o un frammento di codice e mi ricordo che ho già scritto qualcosa di simile prima, e mi piacerebbe riutilizzare precedente realizzazione, tuttavia utilizzando la ricerca di testo non rivela nulla, come non ho usato la variabile nomi che sarebbe esattamente lo stesso.

Avendo frammenti di codice simili porta a duplicazioni inutili code, ma con una grande base di codice è impossibile tenere tutto il codice in memoria. Ci sono strumenti che eseguire alcune analisi del codice e frammenti o funzioni che sono "simili" in termini di funzionalità contrassegnati?

Si consideri 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 / cosa-strumento-to-find-code-duplicati-in-c-progetti

Come rilevare la duplicazione del codice durante lo sviluppo?

Suggerisco di chiusura 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

È stato utile?

Soluzione

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

Altri suggerimenti

La nostra CloneDR trova duplicare il codice, entrambe le copie esatte e le mancate, tra grande fonte sistemi, parametrizzati dalla sintassi langauge. Supporta Java, C #, COBOL, C ++, PHP, Python e molte altre lingue.

Si accetta un numero di parametri per definire, tra cui "Che cosa è un clone?": a) soglia Similarilty, controllando come simili due blocchi di codice deve    essere essere dichiarata come cloni (di solito il 95% è buono) b) il numero di linee di dimensione minima clone (3 tende ad essere una buona scelta) c) il numero di parametri (variazioni distinte al testo; 5 tende ad essere una buona scelta) Con queste impostazioni, tende a trovare 10-15% codice ridondante in virturally tutto quello che elabora.

strumenti di rilevamento clone line-oriented, come Simian non riesce a trovare il codice che clonato è stato riformattato, ma CloneDR farà. Essi possono dire che i due blocchi di corrispondenza del codice, ma di solito non si mostrano esattamente come esse corrispondano o dove le differenze sono; CloneDR farà. Essi non suggeriscono come astratta del codice clonato; CloneDR farà.

In virtù di avere corrispondenza debole algoritmi, tendono a produrre più falsi positivi; quando si ottiene 5000 cloni segnalati attraverso un milione di righe, il numero di falsi positivi conta molto.

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

Questa è la migliore collezione al rilevamento cloni di codice che ho visto:

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

Ci sono molti programmi, ma nessuno di loro sembra essere il migliore o il più popolare. Si può pensare ciò che è il più importante per voi e trovare ciò che si adatta alle vostre esigenze.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top