Partilhar via


Localizando código duplicado usando detecção de clone de código

Os clones de código são fragmentos de código separados que são muito semelhantes.São um fenômeno comum em uma aplicação que foi desenvolvida por algum tempo.Os clones dificultam a alteração do seu aplicativo porque você precisará localizar e atualizar mais de um fragmento.

O Visual Studio Ultimate ou o Visual Studio Premium pode ajudar a localizar clones de código para que seja possível refatorá-los.

É possível localizar os clones de um fragmento específico ou localizar todos os clones em sua solução.Além da descoberta de cópias diretas, a ferramenta de análise de clone pode localizar os fragmentos que diferem em nomes de variáveis e parâmetros, e nos quais algumas instruções foram reorganizadas.

O analisador de clone de código procura por código duplicado em projetos do Visual C# e do Visual Basic em sua solução do Visual Studio.

Resultado da análise do código clone com fortes correspondências

Para localizar clones de um fragmento de código específico

  1. Realce um fragmento de código dentro de um método ou uma definição de get/conjunto.

    ObservaçãoObservação

    É possível localizar os clones declarações, mas não instruções como o campo, o método ou as assinaturas de propriedade.

  2. No menu de atalho do fragmento, escolha Localizar os clones correspondentes na solução.

Use este método quando você deseja saber se há métodos ou fragmentos na existência de sua solução

Para localizar todos os clones em uma solução

  • No menu Analisar, escolha Analisar Solução para Clones de Código.

Este método é particularmente útil quando você está examinando seu código.

ObservaçãoObservação

Os métodos com menos de 10 instruções de tamanho não são digitalizados por este comando.

Os resultados são apresentados por ordem de similaridade.Expanda cada item para ver os fragmentos de código.

Observe que as semelhanças são detectadas mesmo se as variáveis locais usadas por fragmentos tiverem nomes diferentes, e mesmo se quaisquer instruções tiverem sido inseridas ou excluídas.

Para comparar clones

  1. Na janela Resultados do clone de código, selecione dois arquivos, ou um grupo de clone que contém dois arquivos.

  2. Escolha Comparar no menu de atalho.

Este recurso usa a mesma ferramenta de comparação que é usado em versões comparando o controle de origem.Se você desejar modificá-lo, escolha Opções no menu de Ferramentas.Expanda Controle do Código-Fonte e Visual Studio Team Foundation Server.Escolha Configurar Ferramentas do Usuário e então Adicionar.

Para excluir arquivos específicos ou métodos de análise

  1. Adicione um novo arquivo XML ao projeto do Visual Studio no qual os métodos que você deseja excluir estão definidos.

    Não importa se o arquivo é parte do projeto.Deve estar no diretório superior do projeto.

  2. Altere a extensão de nome para .codeclonesettings

  3. Edite o conteúdo do arquivo para que se assemelhe ao exemplo a seguir.

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

Quais clones de código serão localizados?

O analisador de clone de código encontrará clones “próximos”.

Os clones de código geralmente resultam de desenvolvedores que copiam um código e, em seguida, o adaptam no seu novo local.Portanto, é mais fácil considerar o grau da alteração que pode ser feita antes que o analisador não localize o clone.As modificações a seguir podem ser feitas e o clone ainda será reconhecido.Em cada caso, há uma tolerância de um número específico de tais alterações:

  • Renomear identificadores.

  • Inserir e excluir instruções.

  • Reordenar instruções.

Quais duplicatas não serão localizadas?

  • Declarações de tipo não são comparadas.Por exemplo, se você tem duas classes com conjuntos muito semelhantes de declarações de campo, elas não serão relatadas como clone.

    Somente as instruções em métodos e as definições de propriedade são comparadas.

  • Analisar Solução para Clones de Código não encontrará clone em métodos que com menos de 10 instruções de tamanho.

    No entanto, você pode aplicar Localizar clones correspondentes na solução a fragmentos menores.

  • Fragmentos com mais de 40% dos símbolos alterados.

  • Se um projeto contiver um arquivo de .codeclonesettings, os elementos de código que são definidos no projeto não serão pesquisados se estiverem nomeados na seção de Exclusions do arquivo de .codeclonesettings.

  • Alguns tipos de código gerado:

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

    2. Métodos InitializeComponent

    No entanto, isso não se aplica automaticamente a todo o código gerado.Por exemplo, se você usar modelos de texto, convém excluir os arquivos gerados nomeando-os em um arquivo .codeclonesettings.

Quando usar a análise de clone de código

Localizar o clone normalmente é útil nos seguintes casos:

  • Ao atualizar o código existente. Quando você estiver corrigir um bug ou respondendo às alterações nos requisitos, geralmente, você inicia localizando o local no código que precisa ser alterado.Antes de fazer a alteração, procure por clones desse segmento de código.Se os clones forem descobertos:

    1. Considere se você precisa fazer a mesma alteração em cada clone.

    2. Considere também se esta é uma boa oportunidade para refatorar o código clonado em um método ou classe compartilhada.

  • Limpeza arquitetônica. Para o final da cada iteração, use Analisar Solução para Clones de Código no menu Analisar.

  • Quando você cria o código. Ao gravar o novo código, use a ferramenta para localizar o código semelhante já existente.

Aplicando a análise de clone em uma grande base de código

O código é copiado geralmente entre partes suficientemente separadas de um grande projeto, e copiado com frequência para diferentes partes de uma organização.Portanto, você deve procurar os clones na maior base de código possível, não apenas na solução imediata em que você está trabalhando.

Para aplicar o analisador de clone de código através da árvore de origem, crie uma solução que contém todos os projetos no armazenamento.

DicaDica

Lembre-se de que você pode incluir um projeto em mais de uma solução.Para analisar vários projetos para clone de código, você pode criar uma solução que inclui todos os projetos.Você não precisa remover projetos de soluções por meio das quais eles são, geralmente, acessados.

Código gerado

A análise de clone de código não funciona bem com o código gerado.Por exemplo:

  • Código gerado a partir dos modelos T4.

    Para obter mais informações sobre T4, consulte Geração de código e modelos de texto T4.

  • Código gerado por um designer, como os designers de interface de usuário do Silverlight ou do WPF.

Para excluir arquivos gerados pelos modelos T4 do código de análises

  1. Coloque os modelos em um diretório secundário do projeto do Visual Studio.Denomine-o, por exemplo, GeneratedFiles.

  2. Adicione um novo arquivo de texto ao projeto, e modifique seu nome e extensão para t4Exclusions.codeclonesettings

  3. Modifique o conteúdo do arquivo como a seguir:

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