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 LealHoje 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/
- Entendendo o conceito por trás dos processos de Qualidade de SoftwareQualidade e Testes
- Entendendo Indicadores de Prazo e Custo de ProjetosQualidade e Testes
- Aplicação de QUALIDADE de processo de SoftwareQualidade e Testes
- Segurança: Item primordialQualidade e Testes
- Qualidade de Software: Oculte seu códigoQualidade e Testes