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.