Recherche du code dupliqué à l'aide de Code Clone Detection

Les clones de code sont des fragments de code distincts qui sont très similaires.Ils constituent un phénomène commun dans une application qui était en cours de développement depuis quelque temps.Les clones rendent votre application difficile à modifier car vous devez rechercher et mettre à jour plusieurs fragments.

Visual Studio Ultimate ou Visual Studio Premium peut vous aider à trouver des clones de code pour les refactoriser.

Vous pouvez rechercher les clones d'un fragment spécifique ou rechercher tous les clones de votre solution.En plus de découvrir des copies directes, l'outil d'analyse des clones peut trouver les fragments qui diffèrent dans les noms des variables et des paramètres et dans lesquels certaines instructions ont été réorganisées.

L'outil d'analyse des clones de code recherche le code en double dans les projets Visual C# et Visual Basic dans l'ensemble de votre solution Visual Studio.

Résultats d'analyse de clones de code avec des correspondances fortes

Pour rechercher des clones d'un fragment de code particulier

  1. Mettez en surbrillance un fragment de code dans une méthode ou une définition get/set.

    [!REMARQUE]

    Vous pouvez rechercher des clones d'instructions, mais pas des déclarations comme un champ, une méthode ou des signatures de propriété.

  2. Dans le menu contextuel du fragment, choisissez Rechercher des clones correspondants dans la solution.

Utilisez cette méthode lorsque vous voulez savoir si une méthode ou un fragment similaire existe déjà dans votre solution.

Pour rechercher tous les clones d'une solution

  • Dans le menu Analyser, choisissez Analyser les clones de code de la solution.

Cette méthode est particulièrement utile lorsque vous examinez votre code.

[!REMARQUE]

Les méthodes qui comportent moins de 10 instructions ne sont pas recherchés par cette commande.

Les résultats sont présentés dans l'ordre de similitude.Développez chaque élément pour afficher les fragments de code.

Notez que les points communs sont détectés même si les variables locales utilisées par les fragments ont des noms différents et que certaines instructions ont été insérées ou supprimées.

Pour comparer des clones

  1. Dans la fenêtre Résultats des clones de code, sélectionnez deux fichiers ou un groupe de clones qui contient deux fichiers.

  2. Choisissez Comparer dans le menu contextuel.

Cette fonctionnalité utilise le même outil de comparaison utilisé pour comparer des versions sous contrôle de code source.Pour la modifier, choisissez Options dans le menu Outils.Développez Contrôle de code source, puis Visual Studio Team Foundation Server.Choisissez Configurer les outils utilisateur puis Ajouter.

Pour exclure des fichiers ou des méthodes spécifiques de l'analyse

  1. Ajoutez un nouveau fichier XML au projet Visual Studio dans lequel les méthodes que vous souhaitez exclure sont définies.

    Il importe peu que le fichier appartienne au projet.Il doit se trouver dans le répertoire de niveau supérieur.

  2. Remplacez l'extension de nom de fichier par .codeclonesettings

  3. Modifiez le contenu du fichier pour qu'il ressemble à l'exemple ci-dessous.

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

Quels clones de code seront trouvés ?

L'outil d'analyse des clones de code recherchera les clones « near miss ».

Les clones de code proviennent souvent des développeurs qui copient du code et l'adapte ensuite à son nouvel emplacement.Il est donc plus facile de déterminer le degré de modification qui peut être effectué avant que l'outil d'analyse ne trouve pas le clone.Les modifications suivantes peuvent être effectuées sans empêcher l'identification du clone.Dans chaque cas, il existe une tolérance qui correspond à un nombre spécifique de ces modifications :

  • Renommer les identificateurs.

  • Insérer et supprimer des instructions.

  • Réorganiser les instructions.

Quels sont les doublons qui ne seront pas trouvés ?

  • Les déclarations de type ne sont pas comparées.Par exemple, si vous avez deux classes avec des ensembles très similaires de déclarations de champ, elles ne sont pas signalées comme étant des clones.

    Seules les instructions présentes dans les méthodes et les définitions de propriété sont comparées.

  • L'option Analyser les clones de code de la solution ne trouvera pas de clones dans les méthodes qui comportent moins de 10 instructions.

    Toutefois, vous pouvez appliquer Rechercher des clones correspondants dans la solution à des fragments plus courts.

  • Fragments avec plus de 40 % de jetons modifiés.

  • Si un projet contient un fichier .codeclonesettings, les éléments de code qui sont définis dans ce projet ne sont pas détectés s'ils sont nommés dans la section Exclusions du fichier .codeclonesettings.

  • Voici quelques genres de code généré :

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

    2. Méthodes InitializeComponent

    Toutefois, cela ne s'applique pas automatiquement à l'ensemble du code généré.Par exemple, si vous utilisez des modèles de texte, vous pouvez exclure les fichiers générés en les nommant dans un fichier .codeclonesettings.

Quand utiliser l'analyse de clone de code

Rechercher des clones est généralement utile dans les cas suivants :

  • Lors de la mise à jour de code existant. Lorsque vous résolvez un bogue ou que vous répondez aux modifications figurant dans les spécifications, vous commencez généralement par rechercher l'emplacement que vous devez modifier dans le code.Avant d'apporter la modification, recherchez des clones de ce segment de code.Si des clones sont découverts :

    1. Déterminez si vous devez apporter la même modification à chaque clone.

    2. Déterminez également s'il est opportun de refactoriser le code cloné en une méthode ou classe partagée.

  • Nettoyage architectural. Vers la fin de chaque itération, utilisez Analyser les clones de code de la solution dans le menu Analyser.

  • Lorsque vous créez le code. Lorsque vous avez écrit le nouveau code, utilisez l'outil pour rechercher du code semblable qui a déjà existé.

Appliquer l'analyse de clones à une base de code volumineuse

Le code est souvent copié entre les parties assez distinctes d'un grand projet et est souvent copié dans différentes parties d'une organisation.Vous devez donc trouver des clones dans une base de code aussi étendue que possible et pas simplement dans la solution immédiate sur laquelle vous travaillez.

Pour appliquer l'outil d'analyse des clones à votre arborescence source, créez une solution qui contient tous les projets du référentiel.

ConseilConseil

N'oubliez pas que vous pouvez inclure un projet dans plusieurs solutions.Pour rechercher des clones de code dans de nombreux projets, vous pouvez créer une solution qui inclut tous les projets.Vous n'avez pas besoin de supprimer les projets dans les solutions via lesquelles ils sont généralement accessibles.

Code généré

L'analyse des clones de code ne fonctionne pas bien avec le code généré.Par exemple :

  • Le code généré à partir de modèles T4.

    Pour plus d'informations concernant T4, consultez Génération de code et modèles de texte T4.

  • Code généré dans un concepteur comme Silverlight ou des concepteurs d'interface utilisateur WPF.

Pour exclure des fichiers générés par les modèles T4 de l'analyse des clones de code

  1. Placez les modèles dans un sous-répertoire du projet Visual Studio.Nommez-le, par exemple, GeneratedFiles.

  2. Ajoutez un nouveau fichier texte au projet, puis remplacez son nom et son extension par t4Exclusions.codeclonesettings

  3. Modifiez le contenu du fichier comme suit :

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