Gerência - Qualidade e Testes

Introdução a Refatoração

Refatoração em código de software significa tornar o código mais compreensível e bem estruturado alternando o seu design interno de modo a facilitar o desenvolvimento em equipe e a manutenção , e ai estão os grandes ganhos em refatorar o código.

por Ivan Assis Leal



Hoje o desenvolvimento de software conta com muitas tecnologias, linguagens, metodologias e etc. Muitos infelizmente acabam se esquecendo de aprimorar a forma como “escrevem” seu software.

Como consequência temos softwares com códigos onde somente o desenvolvedor original o entende, códigos duplicados, código sem nenhum sentido e podemos citar inúmeros problemas advindos durante o ciclo de desenvolvimento do sistema onde não há a aplicação da prática de refatoração entre os desenvolvedores.

É neste ponto que a refatoração pode auxiliar, refatoração em código de software significa tornar o código mais compreensível e bem estruturado alternando o seu design interno de modo a facilitar o desenvolvimento em equipe e a manutenção , e ai estão os grandes ganhos em refatorar o código.

Um dos grandes nomes da técnica de refactoring – refatoração -  é Martin Fowler, especialista em desenvolvimento de sistemas Orientado a Objetos e entre outras coisas, Refatoração de código. Iremos ao longo de vários artigos descrever em exemplos práticos a utilizam de várias técnicas para refatoração de código.

Extract Method

Extract Method é uma das técnicas de refatoração propostas por Martin Fowler especialista em refactoring.

A técnica de extrair o método é bastante simples e pode causar uma melhoria significativa da leitura e organização de um código, basicamente a técnica consiste em decompor um rotina grande em métodos com código menores.

Analise o exemplo abaixo:

static void Main(string[] args)

{

DataTable objTable;

DataRow row;

objTable = new DataTable();

objTable.Columns.Add("Nome",Type.GetType("System.String"));

objTable.Columns.Add("Profissao", Type.GetType("System.String"));

objTable.Columns.Add("Cidade", Type.GetType("System.String"));

objTable.Columns.Add("SalarioBase", Type.GetType("System.Double"));

objTable.Columns.Add("Descontos", Type.GetType("System.Double"));

row = objTable.NewRow();

row[0] = "Fulano A";

row[1] = "Programador";

row[2] = "Sorocaba";

row[3] = 2500;

row[4] = 250;

objTable.Rows.Add(row);

row = objTable.NewRow();

row[0] = "Fulano B";

row[1] = "Analista";

row[2] = "Sorocaba";

row[3] = 3500;

row[4] = 350;

objTable.Rows.Add(row);

foreach (DataRow objRow in objTable.Rows)

{

Console.WriteLine("Nome: " + objRow[0].ToString());

Console.WriteLine("Profissão: " + objRow[1].ToString());

Console.WriteLine("Cidade: " + objRow[2].ToString());

Console.WriteLine("Salário: " + ((double)objRow[3] -

(double)objRow[4]).ToString());

Console.WriteLine("");

            }

}

O código acima apesar de ser apenas um simples exemplo poder ser refatorado tornando o melhor, para

aplicarmos o Extract Method iremos seguir as seguintes regras:

· Separar o trecho de código do método “pai”, para o novo método dando um nome bem claro sobre seu objetivo a este novo método.

· Remover as variáveis locais do escopo do método “pai” para o novo método, desde que logicamente não interfira no código “pai”.

· Passar as variáveis que são alteradas pelo método “pai” e utilizadas no métodos extraídos como parâmetros desta.

Aplicando a técnica acima podemos refatorar o nosso código da seguinte forma:

private static DataTable ObtemDataTable()

{

DataTable objTable = new DataTable();

objTable.Columns.Add("Nome", Type.GetType("System.String"));

objTable.Columns.Add("Profissao", Type.GetType("System.String"));

objTable.Columns.Add("Cidade", Type.GetType("System.String"));

objTable.Columns.Add("SalarioBase", Type.GetType("System.Double"));

objTable.Columns.Add("Descontos", Type.GetType("System.Double"));

return objTable;

}

private static Double CalculaSalario(DataRow row)

{

double salario = (double)row[3];

double desconto = (double)row[4];

return salario - desconto;

}

private static void ImprimirDados(DataRow row)

{

Console.WriteLine("Nome: " + row[0].ToString());

Console.WriteLine("Profissão: " + row[1].ToString());

Console.WriteLine("Cidade: " + row[2].ToString());

Console.WriteLine("Salário: " + CalculaSalario(row).ToString());

Console.WriteLine("");

}

static void Main(string[] args)

{

DataTable objTable = ObtemDataTable();

DataRow row;

row = objTable.NewRow();

row[0] = "Fulano A";

row[1] = "Programador";

row[2] = "Sorocaba";

row[3] = 2500;

row[4] = 250;

objTable.Rows.Add(row);

row = objTable.NewRow();

row[0] = "Fulano B";

row[1] = "Analista";

row[2] = "Sorocaba";

row[3] = 3500;

row[4] = 350;

objTable.Rows.Add(row);

foreach (DataRow objRow in objTable.Rows)

{

ImprimirDados(objRow);

}

}

Com essa técnica aparentemente simples podemos destacar muitos ganhos:

· Podemos eliminar duplicidade em nosso código por criar métodos para trechos que se repetem.

· Tornamos o código mais legível e de fácil entendimento para outros desenvolvedores.

· Quando decompomos nosso código em pequenas partes tornamos mais fácil o entendimento da lógica.

Fonte da Matéria

· Código Limpo habilidades Práticas do Agile Software – Robert C. Martin

· Martin Fowler Web Site http://martinfowler.com/

· http://www.refactoring.com/

Ivan Assis Leal

Ivan Assis Leal - Atuo a 5 anos com desenvolvimento de software em aplicações de pequeno e médio porte. Possuo experiência em desenvolvimento de aplicações web e desktop, sendo grande entusiasta em práticas de desenvolvimento e gerenciamento ágil de projetos em software. Blog: http://blog.setforcode.com/