Fernando Amaral

Refatoração (Refactoring) em Visual Studio 2008

 

Refactoring, ou refatoração, é o processo de mudar um o código fonte do programa sem alterar suas funcionalidades, sendo estas mudanças relacionadas aos conceitos de orientação a objetos. Este, obviamente, não é um assunto novo, existe bastante bibliografia sobre o assunto além de ferramentas capazes de realizar refatoração para os mais diversos ambientes, porém é claro, você não precisa de uma ferramenta, ela apenas vai tornar o processo automatizado e mais seguro.

Para o Visual Studio, existem diversas produtos de terceiros disponíveis, como Visual Assists, Refactor Pro e ReShaper. Neste artigo vamos falar de algumas das funcionalidades de refatoração nativas do Visual Studio 2008. O triste é que a maioria dos recursos de refatoração só está disponível para o C#.

Ao invés de criar um grande bloco de código e mostrar a funcionamento da refatoração através dele, vamos fazer diferente: vou aplicar cada exemplo em um pequeno bloco de código, o que tornará o entendimento mais simples.

Inicialmente vamos ver quais os tipos de refatoração podemos utilizar nativamente no Visual Studio. Clique com o botão direito sobre um código qualquer, selecione a opção Refactoring, e veja as opções disponíveis:

As opções de refatoração disponíveis são: Rename (renomear), Extract Method (Extrair Método), Encapsulte Field (Encapsular campo), Extract Interface (Extrair Interface), Promote Local Variable to Parameter (Promover Variável local para parâmetro), Remove parameter (Remover parâmetro) e Reorder Parameters (Reordenar parâmetros). Vamos estudar cada uma destas opções. conexao.

Rename

Permite renomear elementos de seu código, procurando todas as chamadas ao elemento. Talvez a forma mais simples de refatoração, e a única que também esta disponível no VB. Observe o código, queremos renomear conexao para conectar. Note que no método incluir há uma chamada a conexao.

 

Basta clicar sobre o nome de qualquer elemento do seu código, e selecionar Rename no menu de contexto.

Na primeira janela você deve informar o novo nome, podendo ainda marcar algumas opções:

Em seguida, você pode pré-visualizar onde as alterações serão executadas:

Ao clicar em Apply, tanto o nome do método quanto suas chamadas, são renomeadas:

Extract Method

A refatoração Extract Method extrai um bloco de código e o transforma em um método, colocando no local onde estava o bloco de código, uma chamada para o método.

No nosso exemplo, temos no método excluir, cujo código instancia uma conexão e faz a abertura da mesma... típico código que pode ser reaproveitado em um método.

Para o refatoramento, selecione o bloco de código e acesse Extract Method no menu de contexto:

Informe o nome do método:

O VS extrai o código e gera um método, substituindo, no local aonde havia o código, por uma chamada ao método:

Dependendo do código onde estamos extraindo o método, o VS pode gerar uma função. Teste o exemplo acima selecionando apenas a primeira linha do código, note que é gerada uma função:

Encapsulte Field

Uma das mais importantes diretrizes da Orientação a Objetos diz respeito encapsular campos, expondo o mesmo ao mundo exterior através de uma propriedade. pAniversario, em nosso código é um candidato a encapsulamento.

Sobre o campo, clique com o botão direito e selecione Encapsulate Field:

De um nome a propriedade.

Note que o VS pode buscar as referencias e permite que você pré-visualize qualquer alteração:

 

 

Veja que o VS mudou o campo para privado e criou a propriedade para controle do campo:

 Extract Interface

Extract Interface extrai uma interface da classe, e faz com que a classe implemente a interface criada. Clique com o botão direito sobre a classe e selecione Extract Interface:

Você em seguida deve selecionar quais membros vão ser implementados na Interface:

O VS cria a interface em um arquivo cs separado:

A declaração da nossa classe também é alterada: agora ela implementa a interface criada:

 Promote Local Variable to Parameter

Analise o código abaixo. Temos um método conectar e outro método excluir, que faz uma chamada a conectar:

Podemos querer promover a variável StringConexao para um parâmetro do método conectar. O VS faz a promoção para parâmetro e ainda atualiza todas as chamadas para o método com o valor atualmente atribuído a variável. Primeiramente selecione Promote Local Variable to Parameter:

Note no resultado, que a string de conexão que era atribuída em uma variável no método, agora é parâmetro da chamada do método no procedimento conectar:

Remove parameter

Este talvez seja o modelo de refatoração que mais possa trazer efeitos colaterais. Remove parameter permite remover um parâmetro da assinatura de um procedimento, atualizando também todas as suas chamadas. Observe no código abaixo o método salvar e uma chamada ao método em inserir.

 

Queremos remover o parâmetro nascimento, para isso acessamos Remove Parameters no menu de contexto:

Clicamos sobre o parâmetro e clicamos em Remove. A janela exibe ainda um alerta sobre a possibilidade de mau funcionamento do programa no caso da remoção de um parâmetro:

Você pode pré-visualizar as alterações:

Pronto, note que o parâmetro foi removido do procedimento e da chamada do mesmo:

Reorder Parameters

Note em nosso código de exemplo abaixo, que temos um procedimento Salvar com duas sobrecargas. Na última sobrecarga os parâmetros estão desordenados com relação à assinatura dos dois primeiro métodos (o parâmetro nome deveria ser o segundo parâmetro). Arrumar isso pode ser simples, mesmo que já tenhamos chamadas ao método em nosso código, como no procedimento inserir mais abaixo:

A refatoração de reordenação de parâmetros da um jeito na bagunça. Selecione Reorder Parameters no menu de contexto:

Informe a ordem correta dos parâmetros:

Você pode pré-visualizar as alterações:

Os parâmetros são reordenados, inclusive na chamada do método em inserir:

Refatoração “Visual”

Algumas refatorações, podem ser implementadas visualmente, como Extract Interface, Encapsulte Field entre outras. Vamos ver como criar a refatoração Extract Interface. Gere um diagrama de uma classe qualquer, clicando com o botão direito sobre o arquivo cs, opção View Class Diagram. Abra o diagrama e clique com o botão direito sobre mesmo, selecione Refactor e Extract Interface:

Você vai ver as mesmas caixas de dialogo, solicitando nome e exibindo alterações, que foram exibidas quando você executou a refatoração no código. O diagrama é atualizado com a interface criada. Obviamente, as mesmas alterações no código fonte são executadas.

Últimas considerações

A aplicação da refatoração vai muito além dos exemplos que mostrei aqui, você pode pro exemplo renomear praticamente qualquer coisa. Os exemplos mostrados com métodos também podem ser aplicados a diversas outras estruturas de código.

No mundo real, a refatoração pode não ser tão simples quanto parece lendo este artigo, as implicações podem ir muito além do que nós ou o VS conseguimos prever. O ideal é investir em boas práticas na escrita do código, evitando, na medida do possível, a necessidade de refatorar seu código.

Últimos artigos relacionados:
Refatoração (Refactoring) em Visual Studio 2008
Medindo a Performance de seu Código com Visual Studio Team System 2008
Code Snippets no Visual Studio 2008
Análise de Código com Visual Studio Team System 2008
.NET independente de plataforma? Uma introdução ao Mono