Desenvolvimento - C#

Refatoração (Refactoring) em Visual Studio 2008

Refactoring, ou refatoração, é o processo de mudar o código fonte do programa sem alterar suas funcionalidades, sendo estas mudanças relacionadas aos conceitos de orientação a objetos.

por Fernando Amaral



Refactoring, ou refatoração, é o processo de mudar um 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.

Fernando Amaral

Fernando Amaral - Certificado PMP pelo PMI, CDIA+ pela CompTia, MCP, MCAD, MCSD, MCDBA, MCT pela Microsoft. Pós Graduado em Gestão de Sistemas de Informação (UNIDERP) e Melhoria em Processos de Software (UFLA). Atualmente reside em Campo Grande, MS, onde presta consultoria, treinamentos e palestras na área de TI.
Blog:
http://www.fernandoamaral.com.br.