Ricerca del codice duplicato mediante il rilevamento del clone di codice

I cloni di codice sono frammenti di codice separati molto simili tra loro.Sono un fenomeno comune in applicazioni il cui sviluppo si protrae per diverso tempo.I cloni rendono l'applicazione difficile da modificare perché è necessario trovare e aggiornare più frammenti.

Visual Studio Ultimate o Visual Studio Premium è in grado di trovare i cloni di codice per consentirne il 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 state disposte in maniera diversa.

L'analizzatore dei cloni di 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

Per trovare i cloni di uno specifico frammento di codice

  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 firme di proprietà, campi o metodi.

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

Utilizzare questo metodo se si desidera sapere se esiste un metodo o frammento simile già esistente nella soluzione.

Per trovare tutti i cloni in una soluzione

  • Scegliere Analizza soluzione per cloni codice dal menu Analizza.

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

[!NOTA]

I metodi con meno di 10 istruzioni non vengono analizzati 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 state inserite o eliminate.

Per confrontare i cloni

  1. Nella finestra Risultati cloni di codice selezionare due file qualsiasi o un gruppo di clonazione contenente 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.

Per escludere file o metodi specifici dall'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 del nome 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 dei cloni di codice cerca 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 non riesca a trovare il clone.Possono essere effettuate le seguenti modifiche senza interferire con il riconoscimento del clone.In ogni caso, è presente una tolleranza di un numero specifico di tali modifiche:

  • Rinominare gli identificatori.

  • Inserire ed eliminare le istruzioni.

  • Ridisporre le istruzioni.

Quali sono i duplicati che non vengono trovati?

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

    Vengono confrontate solo le istruzioni nei metodi e nelle definizioni delle proprietà.

  • Analizza soluzione per cloni codice non individua i cloni contenenti 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 l'analisi dei cloni 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 i cloni del segmento di codice.Se vengono individuati cloni:

    1. Valutare 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à esistente.

Applicare l'analisi dei cloni a un codebase di grandi dimensioni

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

Per applicare l'analizzatore dei cloni di codice alla 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 dei cloni 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.

Per escludere i file generati dai modelli T4 dall'analisi dei cloni di codice

  1. Inserire i modelli in una sottodirectory nel progetto di Visual Studio.Denominarla, ad esempio, GeneratedFiles:

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

  3. Modificare il contenuto del file come segue:

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