2010-06-21 1 views
40

Sono in un progetto in cui i precedenti programmatori sono stati in grado di copiare i codici dappertutto. Questi codici sono in realtà identici (o molto simili) e potrebbero essere stati ridimensionati in uno solo.Strumenti per il rilevamento del codice duplicato (Java)

Ho trascorso innumerevoli ore a refactoring di questi codici manualmente, ma penso che ci sia un modo migliore. Alcuni sono metodi statici molto banali che potrebbero essere stati spostati in una classe di antenati (ma è stata invece copiata da tutti i precedenti programmatori junior).

Esiste uno strumento di analisi del codice in grado di rilevare questo e fornire rapporti/raccomandazioni? Preferisco lo strumento gratuito/open source se possibile.

+5

Abbastanza sfortunato che alcune delle discussioni più utili siano chiuse come "fuori tema". La discussione qui sotto contiene "risposte e spam supponenti"? Perché non appena la gente ottiene un po 'di potere sperimenta questo costante bisogno di controllare qualcosa che non richiede alcuna sorveglianza? – user1433852

risposta

24

ho utilizzare i seguenti strumenti:

Entrambi gli strumenti sono supportati per il rilevamento della duplicazione del codice. Ma a entrambi manca la capacità di consigliarti come rifattorizzare il tuo codice.

JetBrains IntelliJ IDEA Ultimate ha una buona analisi del codice statico con supporto per la duplicazione del codice, ma non è gratuito.

+3

Checkstyle - non [altro] (https://github.com/checkstyle/checkstyle/issues/523) – KrishPrabakar

5

La maggior parte degli strumenti elencati nell'articolo di Wikipedia su Duplicate Code Tools rileverà i duplicati in molte lingue diverse, incluso Java.

+0

Grazie per il link. –

+3

Da quando qualcuno ha rimosso i collegamenti unencyclopedic da wikipedia, ecco il link alla vecchia versione della pagina: http://en.wikipedia.org/w/index.php?title=Duplicate_code&oldid=522795578 ​​ – Nickolay

1

O Simian o PMD CPD. Il primo supporta un insieme più ampio di lingue, ma non è gratuito per i progetti commerciali.

+1

Una caratteristica di Simian è abbastanza buona è la capacità di trovare codice che non è stato copiato, ma sviluppato indipendentemente. Quindi potrebbe fare la stessa cosa, ma avere nomi di variabili completamente diversi e persino sottotipi. Nella configurazione di simainls è possibile specificare di ignorare i nomi delle variabili e considerare i sottotipi come lo stesso tipo genitore ecc. – drekka

+0

È estremamente raro che i rilevatori di cloni trovino il codice che "non è stato copiato ma sviluppato indipendentemente" a meno che i frammenti di codice non siano microscopici (a * b è un clone di x * y ed è sviluppato indipendentemente ma non interessa a nessuno). Avendo costruito un forte rilevatore di cloni, la mia esperienza è ciò che trovano è codice che è stato clonato; quelli migliori possono trovare il codice clonato con nomi variabili modificati e costanti differenti. Simian è uno di questi. Quelli forti (il mio è uno di questi) possono rilevare quando sub-espressioni arbitrarie e dichiarazioni sono state sostituite. –

+0

Simian non sembra essere più nella sua forma originale. In ogni caso, il link è morto. Ecco un link a uno strumento di Simian ma non mi è chiaro se si tratti dello stesso prodotto: http://www.harukizaemon.com/simian/ – pjv

0

Vedere il nostro SD Java CloneDR, uno strumento per la rilevazione esatta e vicino-miss codice duplicato nei grandi sistemi Java.

CloneDR troverà i cloni di codice nonostante le modifiche di spazi bianchi, interruzioni di riga, eliminazioni di inserimenti di commenti, modifica di costanti o identificatori e, in un numero di casi, anche la sostituzione di una dichiarazione con un'altra o un blocco di istruzioni.

Mostra dove si trova ogni set di cloni, ogni singolo clone, un'astrazione dei cloni con la loro comunanza condivisa e la parametrizzazione dell'astrazione per mostrare come ogni istanza di clone può essere derivata dall'astrazione.

Trova cloni al 10-20% nella maggior parte dei sistemi Java.

+0

Non è gratuito, ma lo farò comunque girare. –

5

SonarQube è in grado di rilevare codici duplicati ma non fornisce consigli per eliminarli. È gratuito e, sebbene con la configurazione di default, è in grado di rilevare solo cloni identicamente lessicali: esiste un plug-in gratuito CodeAnalyzer for SonarQube con il quale è possibile rilevare cloni strutturali più sofisticati invece di quelli lessicali.