Ricerca del codice duplicato mediante il rilevamento del clone di codice

I cloni di codice sono frammenti di codice separati che sono molto simili.Sono un fenomeno comune in un'applicazione che è stata sviluppata per un certo periodo di tempo. I cloni rendono l'applicazione difficile da modificare perché è necessario trovare e aggiornare più di un frammento.Visual Studio consente di trovare cloni di codice in modo da poter eseguire l'operazione di refactoring.

È possibile trovare cloni di un frammento specifico, o trovare tutti i cloni nella soluzione.Oltre a individuare le copie dirette, lo strumento di analisi dei cloni trova i frammenti che presentano nomi di variabili e parametri diversi e in cui alcune istruzioni sono stati disposte in maniera diversa.

L'analizzatore di clonazione del codice cerca il codice duplicato in progetti di Visual C# e visual Basic nella soluzione di Visual Studio.

Risultato analisi clone codice con corrispondenze alte

Trovare i cloni di un frammento di codice specifico

  1. Evidenziare un frammento di codice in un metodo o di una definizione get/set.

    [!NOTA]

    È possibile trovare cloni di istruzioni, ma non di dichiarazioni come segnature di campi, metodi o proprietà.

  2. Nel menu di scelta rapida del frammento, scegliere Trova cloni corrispondenti in soluzione.

Utilizzare questo metodo se si desidera sapere se esiste un simile metodo o frammento che esiste già all'interno della soluzione.

Trovare tutti i cloni in una soluzione

  • Dal menu Analizza, scegliere Analizza soluzione per cloni codice.

Questo metodo è particolarmente utile quando si desidera rivedere il codice.

[!NOTA]

I cloni inferiori a 10 istruzioni non vengono individuati da questo comando.

I risultati vengono presentati in ordine di somiglianza.Espandere ciascun elemento per visualizzare i frammenti di codice.

Si noti che le analogie vengono rilevate anche se le variabili locali utilizzate dai frammenti hanno nomi diversi e anche se alcune istruzioni sono stati inserite o eliminate.

Confrontare i cloni

  1. Nella finestra Risultati cloni di codice, selezionare due file qualsiasi, o un gruppo di clonazione che contiene due file.

  2. Scegliere Confronta dal menu di scelta rapida.

Questa funzionalità utilizza lo stesso strumento di confronto che viene utilizzato per confrontare le versioni nel controllo del codice sorgente.Se si desidera modificarlo, scegliere Opzioni dal menu Strumenti.Espandere Controllo del codice sorgente, quindi Visual Studio Team Foundation Server.Scegliere Configura strumenti utente quindi Aggiungi.

Escludere file specifici o ai metodi dell'analisi

  1. Aggiungere un nuovo file XML al progetto di Visual Studio in cui vengono definiti i metodi che si desidera escludere.

    Non è importante se il file appartiene al progetto.Deve essere nella directory principale del progetto.

  2. Modificare l'estensione di file in .codeclonesettings

  3. Modificare il contenuto del file in modo che risulti simile al seguente esempio.

    <CodeCloneSettings>
      <Exclusions>
        <!-- Add any combination of the following node types. -->
        <!-- Absolute or relative path names: -->
        <File>MyFile.cs</File>
        <!-- Filepaths may contain wildcards: -->
        <File>GeneratedFiles\*.cs</File>
        <!-- Namespace, Type, and FunctionName must be fully qualified: -->
        <Namespace>MyCompany.MyProject</Namespace>
        <Type>MyCompany.MyProject.MyClass1</Type>
        <FunctionName>MyCompany.MyProject.MyClass2.MyMethod</FunctionName>
        <!-- Names may contain wildcards: -->
        <Namespace>*.AnotherProject</Namespace>
        <Type>*.AnotherClass*</Type>
        <FunctionName>MyProject.*.AnotherMethod</FunctionName>
      </Exclusions>
    </CodeCloneSettings>      
    

Quali cloni di codice saranno trovati?

L'analizzatore di clonazione di codice cercherà cloni "molto simili".

Il cloni di codice spesso derivano dal fatto che gli sviluppatori copiano il codice e poi lo adattano alla nuova posizione.È quindi più semplice considerare il grado di modifica che può essere effettuato prima che l'analizzatore fallisca nel trovare il clone.Le seguenti modifiche possono essere effettuate e il clone verrà comunque riconosciuto.In ogni caso, è presente una tolleranza di un numero specifico di tali modifiche:

  • Rinominare gli identificatori.

  • Inserire ed eliminare le istruzioni.

  • Ridisporre le istruzioni.

Hh205279.collapse_all(it-it,VS.110).gifQuali sono i duplicati che non si troveranno?

  • Le dichiarazioni di tipo non vengono confrontate.Ad esempio, se si dispone di due classi con insiemi di dichiarazioni di campi molto simili, non verranno segnalate come cloni.

    Solo le istruzioni nei metodi e nelle definizioni delle proprietà vengono confrontati.

  • Analizza soluzione per cloni codice non individuerà i cloni che siano lunghi meno di 10 istruzioni.

    Tuttavia, è possibile utilizzare Trova cloni corrispondenti in soluzione per cercare frammenti più brevi.

  • Frammenti con più del 40% dei token modificati.

  • Se il progetto contiene un file .codeclonesettings, gli elementi di codice che sono definiti nel progetto non verranno cercati se sono denominati nella sezione Exclusions del file .codeclonesettings.

  • Alcuni tipi di codice generato:

    1. *.designer.cs, *.designer.vb

    2. Metodi InitializeComponent

    Tuttavia, questo non viene applicato automaticamente a tutto il codice generato.Ad esempio, se si utilizzano modelli di testo, potrebbe essere necessario escludere i file generati menzionandoli in un file .codeclonesettings.

Quando utilizzare la tracciatura di clonazione di codice

Trovare cloni è in genere utile nei seguenti casi:

  • Durante l'aggiornamento del codice esistente. Durante la correzione di un bug, o in risposta alle modifiche nei requisiti, in genere si inizia cercando la posizione del codice da modificare.Prima di apportare la modifica, cercare dei cloni del segmento di codice.Se vengono individuati dei cloni:

    1. Considerare se è necessario apportare la stessa modifica a ogni clone.

    2. Considerare anche se questa può essere una buona opportunità per effettuare il refactoring del codice duplicato in un metodo o una classe condivisi.

  • Pulizia dell'architettura. Verso la fine di ogni iterazione, utilizzare Analizza soluzione per cloni codice nel menu Analizza.

  • Quando si crea il codice. Dopo la scrittura di nuovo codice, utilizzare lo strumento per trovare codice analogo già esiste.

Applicare l'analisi di clonazione a un codebase di grandi dimensioni

Il codice viene spesso copiato tra parti piuttosto distinte di un grande progetto e spesso viene copiato a parti diverse di un'organizzazione.È quindi possibile cercare cloni in un codebase più grande possibile, non solo nella soluzione immediata su cui si sta lavorando.

Per applicare l'analizzatore di clonazione di codice attraverso la struttura ad albero di origine, creare una soluzione contenente tutti i progetti nel repository.

SuggerimentoSuggerimento

Tenere presente che è possibile includere un progetto in più soluzioni.Per cercare i cloni di codice in molti progetti, è possibile creare una soluzione che include tutti i progetti.Non è necessario rimuovere i progetti dalle soluzioni tramite le quali vengono generalmente utilizzati.

Codice generato

L'analisi di clonazione di codice non è compatibile con il codice generato.Ad esempio:

  • Codice generato dai modelli T4.

    Per ulteriori informazioni su T4, vedere Generazione di codice e modelli di testo T4.

  • Codice generato da una finestra di progettazione come le finestre di progettazione dell'interfaccia utente WPF o Silverlight.

Escludere i file generati dai modelli T4 dall'analisi della clonazione di codice

  1. Posizionare i modelli in una sotto directory nel progetto di Visual Studio.Nominarlo, ad esempio, GeneratedFiles:

  2. Aggiungere un nuovo file di testo al progetto e modificare nome ed estensione a t4Exclusions.codeclonesettings

  3. Modificare il contenuto del file come segue:

    <CodeCloneSettings>
      <Exclusions>
        <File>GeneratedFiles\*.cs</File>
      </Exclusions>
    </CodeCloneSettings>