Domanda Come trovare un frammento di codice simile?


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

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 i nomi delle variabili che essere esattamente lo stesso

Avere frammenti di codice simili porta a una duplicazione del 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à?

Considera 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 questo sia già stato chiesto e risposto diverse volte:

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

Come rilevare la duplicazione del codice durante lo sviluppo?

Suggerisco di chiudere come duplicato qui.


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


19
2018-04-02 13:36


origine


risposte:


Puoi usare scimmiesco. È 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.


10
2018-04-02 13:43



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

Accetta un numero di parametri per definire "Cos'è un clone?", Tra cui: a) Soglia di similarità, che controlla quanto devono essere simili due blocchi di codice    essere dichiarato come cloni (in genere il 95% è buono) b) numero di linee 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 il codice ridondante 10-15% in virgola tutto ciò che elabora.

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

In virtù di avere una corrispondenza più debole algoritmi, tendono a produrre più falsi positivi; quando ricevi 5000 cloni segnalati su un milione di linee, il numero di falsi positivi conta molto.

Sulla base del tuo esempio, mi aspetterei che trovi quei due frammenti (non hai punto per nessuno dei due) e nota che loro sono simili se si astraggono i nomi delle variabili.


3
2017-08-23 05:57



Ecco la migliore raccolta sul rilevamento dei 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. Puoi pensare qual è il più importante per te e trovare ciò che si adatta alle tue esigenze.


-1
2017-12-15 21:05