Domanda:
Strumento per suggerimenti sui metodi di estrazione
durron597
2014-04-30 20:03:12 UTC
view on stackexchange narkive permalink

Esiste uno strumento che ricerca il codice e fornisce consigli per l'estrazione di metodi candidati con codice duplicato? Ecco un esempio davvero artificioso:

  import java.util.List; public class ExtractMethod {public boolean mode; public String getFirst (List<String> one, List<String> two) {if (mode) {StringBuilder sb = new StringBuilder (); for (String elements: one) {sb.append (elements.charAt (0)); } return sb.toString (); } altro {StringBuilder sb = new StringBuilder (); for (Elementi stringa: due) {sb.append (elements.charAt (0)); } return sb.toString (); }}}  

Se selezioni le linee duplicate in Eclipse e selezioni Extract Method, ottieni questo:

  import java.util.List; public class ExtractMethod {modalità booleana pubblica; public String getFirst (List<String> one, List<String> two) {if (mode) {return getFirstFromList (one); } else {return getFirstFromList (due); }} private String getFirstFromList (List<String> one) {StringBuilder sb = new StringBuilder (); for (String elements: one) {sb.append (elements.charAt (0)); } return sb.toString (); }}  

Fantastico. Esiste uno strumento che esamina una classe e fornisce consigli su buoni candidati per farlo?

Due risposte:
Konstantin V. Salikhov
2014-05-01 20:47:36 UTC
view on stackexchange narkive permalink

Il popolare analizzatore di codice PMD open source gratuito ha un rilevatore di copia-incolla CPD: può trovare frammenti di codice simili che sono buoni candidati per il refactoring del "metodo di estrazione". È multipiattaforma e può essere eseguito in qualsiasi sistema in cui sia implementato JRE. Ha anche una vasta gamma di plugin per strumenti di build e IDE popolari come Maven, Eclipse, Ant, ecc.

Aggiunte qualche informazione in più.
+1 Sembra fantastico! Accetto dopo averlo provato.
Sembra fantastico ora :)
Ok, in realtà questo non è quello che sto cercando, per quanto posso dire cerca solo corrispondenze esatte, non "codice simile"
Inoltre richiede che la dimensione della piastrella sia almeno 25. Non trova alcuna duplicazione nell'esempio fornito nell'OP.
Dai un'occhiata alle opzioni di configurazione come ignora i letterali, ignora gli identificatori ecc. Questo strumento non è solo un localizzatore di corrispondenze esatte.
È anche possibile configurare la dimensione minima dei duplicati, AFAIK
@KonstantinV.Salikhov Ho scaricato lo strumento integrato Eclipse; Ho provato ad abbassare le dimensioni ma non me lo sono permesso. È possibile che lo strumento Eclipse sia dietro il bagagliaio?
Non so di eclipse, la versione da riga di comando sarebbe qualcosa come `java net.sourceforge.pmd.cpd.CPD --minimum-tokens 10 --files / mysourcesdir`
Ira Baxter
2015-06-02 07:12:07 UTC
view on stackexchange narkive permalink

Il nostro strumento CloneDR lo farà, rilevando i cloni in migliaia di file. Non gli dai altro che i file; determina automaticamente i cloni.

Un set clone è un insieme di blocchi di codice considerati simili. Spesso i set di cloni sono solo coppie, a volte di migliaia di righe, questo accade quando i file sorgente vengono copiati in massa nel codice di base. Sorprendentemente, i set di cloni possono avere 3, 100, fino a diverse centinaia di istanze di codice simile; di solito il singolo clone in quest'ultimo caso è di 4-10 righe e rappresenta un linguaggio usato ovunque nella base del codice (ad esempio, una routine di conversione da stringa a numero).

Tra i quasi 10.000 set di cloni esso trova in oltre 1MSLOC di codice che comprende una versione di Eclipse JDT, troverà questi due cloni:

  this.declaringQualification = isCaseSensitive ()? dichiaringQualification: CharOperation.toLowerCase (dichiaringQualification); this.declaringSimpleName = isCaseSensitive ()? dichiaringSimpleName: CharOperation.toLowerCase (dichiaringSimpleName); this.typeQualification = isCaseSensitive ()? typeQualification: CharOperation.toLowerCase (typeQualification);  

e

  this.declaringQualification = isCaseSensitive ()? dichiaringQualification: CharOperation.toLowerCase (dichiaringQualification); this.declaringSimpleName = isCaseSensitive ()? dichiaringSimpleName: CharOperation.toLowerCase (dichiaringSimpleName); this.returnQualification = isCaseSensitive ()? returnQualification: CharOperation.toLowerCase (returnQualification);  

e suggerisci questa astrazione parametrizzata (non proprio un metodo, ma abbastanza vicino:

  this.declaringQualification = isCaseSensitive ()? dichiarantiQualification: CharOperation.toLowerCase (dichiariQualification); this.declaringSimpleName = isCaseSensitive ()? dichiariSimpleName: CharOperation.toLowerCase (dichiariSimpleName);
Questo. [[# variable5a6b82a0]] = isCaseSensitive ()? [[# variable5a6b82a0]]: CharOperation.toLowerCase ([[# variable5a6b82a0]]);  

Nota che ha deciso che il codice ha solo un parametro, non due .

Troverà espressioni più grandi, anche dichiarazioni, come parametri; in quest'ultimo caso, suggerisce effettivamente che è necessario un lambda come parametro.

Puoi controllare la dimensione di un clone, quanti parametri sono consentiti e quanto simili devono essere i blocchi di codice per essere considerati cloni. Nell'esempio inventato di OP in un file, con le giuste impostazioni, dovrebbe rilevare i blocchi interni come cloni con un singolo parametro. (Nessuno esegue esempi così piccoli nella pratica.)

(Il sito ha molti esempi in molte lingue).

This is pretty cool, I'll have to take a look at it later. By the way, please don't create new tags that don't add to the question. See the [help center](http://softwarerecs.stackexchange.com/help/privileges/create-tags)
"copy-paste-detection" is a widely known term for clone-detection tools. (I always thought "clone detection" was a fine term, but the world seems to think otherwise).


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...