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