Buscar código duplicado usando la detección de clones de código

Los clones de código son fragmentos separados del código que son muy similares.Son un fenómeno común en una aplicación que haya estado en desarrollo durante algún tiempo.Los clones hacen que la aplicación sea difícil de cambiar porque hay que buscar y actualizar más de un fragmento.

Visual Studio Ultimate o Visual Studio Premium pueden ayudar a buscar clones de código para poder refactorizarlos.

Es posible buscar clones de un fragmento específico o todos los clones de la solución.Además de detectar las copias directas, la herramienta de análisis de clones puede encontrar fragmentos que difieran en nombres de variables y parámetros y en los que se hayan reorganizado algunas instrucciones.

El analizador de clones busca código duplicado en proyectos de Visual C# y Visual Basic en la solución de Visual Studio.

Resultado del análisis de clones de código con coincidencia elevada

Para buscar clones de un fragmento de código determinado

  1. Resalte un fragmento de código dentro de un método o una definición get/set.

    [!NOTA]

    Puede buscar clones de instrucciones, pero no declaraciones tales como signaturas de campo, método o propiedad.

  2. En el acceso directo del fragmento, elija Buscar clones coincidentes en la solución.

Utilice este método si desea buscar un método o fragmento similar ya existente en la solución.

Para buscar todos los clones en una solución

  • En el menú Analizar, elija Analizar solución para clones de código.

Este método es especialmente útil cuando se está revisando el código.

[!NOTA]

Este comando no detecta los métodos que tienen menos de 10 instrucciones.

Los resultados se muestran en orden de similitud.Expanda cada elemento para ver los fragmentos de código.

Observe que las similitudes se detectan incluso si las variables locales que se utilizan en los fragmentos tienen nombres diferentes e, incluso, si se han insertado o eliminado algunas instrucciones.

Para comparar clones

  1. En la ventana Resultados de clonación de código, seleccione dos archivos o un grupo de clonación que contenga dos archivos.

  2. Elija Comparar en el acceso directo.

Esta característica utiliza la misma herramienta de comparación que se utiliza para comparar versiones bajo control del código fuente.Si desea modificarlo, elija Opciones desde el menú Herramientas.Expanda Control de código fuente y Visual Studio Team Foundation Server.Elija Configurar herramientas de usuario y, a continuación, Agregar.

Para excluir archivos o métodos concretos del análisis

  1. Agregue un nuevo archivo XML al proyecto de Visual Studio en el que se definan los métodos que desea excluir.

    No importa si el archivo es parte del proyecto.Debe estar en el directorio superior del proyecto.

  2. Cambie la extensión de nombre de archivo a .codeclonesettings

  3. Edite el contenido del archivo para que sea similar al siguiente ejemplo.

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

¿Qué clones de código se encontrarán?

El analizador de clones de código encontrará fragmentos de código casi idénticos.

Los clones de código suelen producirse cuando los desarrolladores copian código y luego lo adaptan a su nueva ubicación.Por consiguiente, es más fácil considerar el nivel de cambios que se pueden hacer antes de que el analizador no encuentre el clon.Se pueden hacer las modificaciones siguientes y se seguirá reconociendo el clon.En cada caso, hay tolerancia para un número concreto de estas modificaciones:

  • Cambiar nombre de identificadores.

  • Insertar y eliminar instrucciones.

  • Reorganizar instrucciones.

¿Qué duplicados no se encontrarán?

  • Las declaraciones de tipos no se comparan.Por ejemplo, si tiene dos clases con conjuntos muy similares de declaraciones de campo, no se mostrarán como clones.

    Solo se comparan las instrucciones de los métodos y las definiciones de propiedad.

  • Analizar solución para clones de código no encontrará clones en métodos que tengan menos de 10 instrucciones de longitud.

    No obstante, puede aplicar Buscar clones coincidentes en la solución a fragmentos más cortos.

  • Fragmentos con más del 40 % de tokens modificados.

  • Si un proyecto contiene un archivo .codeclonesettings, los elementos de código que se definen en ese proyecto no se buscan si se llaman en la sección Exclusions del archivo .codeclonesettings.

  • Algunos tipos de código generado:

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

    2. Métodos InitializeComponent

    Sin embargo, esto no se aplica automáticamente a todo el código generado.Por ejemplo, si se utilizan plantillas de texto, quizá desee excluir los archivos generados nombrándolos en un archivo .codeclonesettings.

Cuándo utilizar el análisis de clones de código

Encontrar clones suele ser útil en los siguientes casos:

  • Al actualizar el código existente. Cuando se corrige un error o se responde a los cambios en los requisitos, se empieza normalmente por buscar la ubicación en el código que se necesita cambiar.Antes de realizar el cambio, busque clones de ese segmento de código.Si se detectan clones:

    1. Considere si se debe realizar el mismo cambio en cada clon.

    2. Considere también si esta es una buena oportunidad para refactorizar el código clonado en un método o clase compartidos.

  • Limpieza de arquitectura. Hacia el final de cada iteración, utilice Analizar solución para clones de código en el menú Analizar.

  • Cuando se crea código. Cuando haya escrito nuevo código, utilice la herramienta para buscar código similar ya existente.

Aplicar el análisis de clonación a una base de código extensa

El código se suele copiar entre partes muy separadas de un proyecto grande y, a menudo, se copia a diferentes partes de una organización.Por consiguiente, la búsqueda de clones se debe realizar en una base de código tan grande como se pueda, no solo en la solución inmediata en la que se está trabajando.

Para aplicar el analizador de clones de código al árbol de código fuente, cree una solución que contenga todos los proyectos del repositorio.

SugerenciaSugerencia

Recuerde que se puede incluir un proyecto en más de una solución.Para analizar si hay clones de código en muchos proyectos, puede crear una solución que incluya todos los proyectos.No es necesario quitar los proyectos de las soluciones mediante las cuales se tiene acceso normalmente.

Código generado

El análisis de clonación de código no funciona bien con código generado.Por ejemplo:

  • Código generado desde plantillas T4.

    Para obtener más información sobre T4, vea Generación de código y plantillas de texto T4.

  • Código generado desde un diseñador tal como los diseñadores de interfaz de usuario de Silverlight o WPF.

Para excluir archivos generados por plantillas T4 del análisis de clones de código

  1. Coloque las plantillas en un subdirectorio del proyecto de Visual Studio.Llámelo, por ejemplo, GeneratedFiles.

  2. Agregue un nuevo archivo de texto al proyecto y cambie su nombre y extensión a t4Exclusions.codeclonesettings

  3. Cambie el contenido del archivo de la manera siguiente:

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