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 AmaralRefactoring, 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.