P>
Clique aqui para ler todos os artigos desta edição
Visual Studio
Refactoring - Conceito e aplicação prática
Você concorda que parte do tempo de trabalho de um desenvolvedor de software envolve revisão de código? Essa parcela de tempo tende a aumentar conforme o andamento do projeto, embora normalmente, não seja computado ou mesmo mencionado nele.
Conhecer técnicas e recursos para tornar a revisão de código mais rápida e mais produtiva deve estar entre as prioridades de um desenvolvedor, para que ele possa entregar seu projeto com maior qualidade e com menor esforço.
Mostrar a técnica de refatoração de código e os novos recursos disponíveis no Visual Studio 2005 para promovê-la são os objetivos deste artigo. Revise e divirta-se!
Conceito
Refatoração não é uma nova técnica e não foi inventada para o Visual Studio 2005. É muito provável que você utilize-a no dia a dia, embora, talvez não a chamando pelo seu nome formal. Refatoração, do termo refactoring, é formalmente o processo de reescrever código para promover seu entendimento e legibilidade, mantendo inalterados seu comportamento ou uso externo.
Você está aplicando refatoração quando, por exemplo, muda o nome de uma variável para taxaConversaoReal ao invés de tCR, quando troca um valor “hardcoded” por uma enumeração e quando, ao invés de repetir a mesma parte de um código em dois métodos diferentes, o centraliza em um e torna os dois primeiros clientes dele.
Observe que, nestes três exemplos o comportamento externo do software em si não foi modificado, somente sua estrutura interna, tornando-o mais compreensível e claro. O objetivo da refatoração não é adicionar novas funcionalidades ao software ou corrigir bugs, embora a aplicação da refatoração torne muito mais fácil detectá-los, pois eles vão se tornar mais visíveis.
Dependendo do tamanho da empresa em que você trabalha e do grau de maturidade do software que ela produz, você deve estar acostumado a desenvolver código seguindo uma padronização definida. Na maioria dos casos essa padronização surge conforme o tempo, o que significa que existe código não-padronizado e já padronizado.
A refatoração, ou seja, a revisão e alteração de código pré-existente são úteis nesse contexto, porque ajudam a padronizar o código antigo. Código padronizado, por sua vez, aumenta a legibilidade e promove maior rapidez e produtividade no desenvolvimento.
Outro aspecto importante sobre refatoração é que refatorar código não significa modificar um grande trecho de código de uma só vez, mas sim realizar pequenas mudanças em pequenos trechos. É a soma das pequenas alterações que melhora significativamente o código.
Cada alteração no código, também chamado transformação de código, obedece a um padrão conhecido e possui um nome. Voltando aos exemplos citados anteriormente, renomear uma variável é aplicar o padrão Rename, substituir um valor hardcoded por uma enumeração é aplicar o padrão Substituir Número Mágico Por Constante Simbólica e finalmente, recortar um pedaço de código e usá-lo para criar um método novo é aplicar o padrão Extract Method.
Martin Fowler, autoridade no assunto, escreveu o livro Refatoração: Aperfeiçoando o Projeto de Código Existente (Editora Bookman, ISBN 8536303956) que descreve quase cem padrões de refatoração. Ele também é autor do site www.refactoring.com onde você pode encontrar artigos e descrições para todos os padrões de refatoração.
Conforme a explicação anterior, refatoração não é uma técnica nova ou inventada para o Visual Studio 2005. Contudo, os recursos para refatoração antes do Visual Studio 2005 resumiam-se, principalmente, em ações de copiar-colar e recortar-colar e não havia nenhum outro tipo de suporte para facilitar a tarefa.
Felizmente, o Visual Studio 2005 traz novas funcionalidades criadas para facilitar a refatoração e diminuir os problemas gerados na época em que essa tarefa era realizada sem recursos (copiar-colar e recortar-colar, acredite, contribui mais para difundir problemas do que resolvê-los).
Nas próximas seções demonstraremos as novas funcionalidades entregues pelo Visual Studio 2005 para facilitar a tarefa de refatoração.
Suporte à refatoração no Visual Studio 2005
O Visual Studio 2005 suporta sete dos mais comuns padrões de refatoração, utilizados em um prático menu de contexto chamado Refactor e que você pode acessar com um clique do mouse.
Considere isso em conjunto com a possibilidade de alterar referências em múltiplos projetos e você terá uma idéia de quão útil e fácil de usar eles podem ser. A Figura 1 exibe o novo menu de contexto Refactor.

Figura 1. Menu de contexto Refactor
Mencionamos também que a refatoração é uma tarefa arriscada se não for feita com cuidado e evitando que grandes trechos de código sejam alterados de uma única vez. O Visual Studio 2005 auxilia a garantir que as alterações estão corretas, apresentando uma janela de preview para que você possa visualizar todas as alterações a serem realizadas e decidir se deve efetivá-las ou não. A Figura 2 exibe a janela de preview.

Figura 2. Janela de preview para refatoração
As próximas seções detalham cada um dos padrões de refatoração disponíveis no Visual Studio 2005. Devido à refatoração ser muito mais uma técnica ou uma boa prática do que uma tecnologia propriamente dita, tentaremos demonstrá-la da forma mais prática possível usando exemplos curtos, porém coerentes. Todos os exemplos estão baseados no dia a dia do desenvolvimento de uma loja de música virtual.
Renomear
O padrão Rename é o mais simples dos padrões de refatoração e também o mais útil. Você pode renomear variáveis locais, métodos, propriedades, tipos, namespaces etc. O Visual Studio 2005 permite até mesmo que essas alterações afetem comentários feitos com o nome do item modificado. Considere o código da Listagem 1.
Listagem 1. Código pré-operação Renomear
using System;
using System.Text.RegularExpressions;
namespace NetMagRefactoring
{
public class Search
{
public string name = string.Empty;
public string SearchArtist()
{
string aN = this.name;
string returnText = String.Empty;
if (aN != string.Empty)
{
aN = Regex.Replace(aN, "[áäàâã]", "a");
aN = Regex.Replace(aN, "[éëèê]", "e");
aN = Regex.Replace(aN, "[íïìî]", "i");
aN = Regex.Replace(aN, "[óöòôõ]", "o");
aN = Regex.Replace(aN, "[úüùû]", "u");
aN = Regex.Replace(aN, "[ç]", "c");
aN = Regex.Replace(aN, "[ñ]", "n");
aN = Regex.Replace(aN, "[ÁÄÀÂÃ]", "A");
aN = Regex.Replace(aN, "[ÉËÈÊ]", "E");
aN = Regex.Replace(aN, "[ÍÏÌÎ]", "I");
aN = Regex.Replace(aN, "[ÓÖÒÔÕ]", "O");
aN = Regex.Replace(aN, "[ÚÜÙÛ]", "U");
aN = Regex.Replace(aN, "[Ç]", "C");
aN = Regex.Replace(aN, "[Ñ]", "N");
aN = Regex.Replace(aN, "[.]", "");
aN = Regex.Replace(aN, "[,]", "");
aN = Regex.Replace(aN, "[;]", "");
returnText =
...