You are on page 1of 9

APLICAO DA REFATORAO PARA A MELHORIA DA QUALIDADE DE SOFTWARE PARA A REDUO DE CUSTOS COM MANUTENO

Leonel Arajo Faculdade de Tecnologia do Nordeste - FATENE

Resumo
Estima-se que cerca de 50% de tempo de um engenheiro de software gasto com tarefas de manuteno e compreenso de cdigo. A tcnica da refatorao o processo de alterar um software para melhorar sua qualidade interna preservando seu comportamento. Assim, essa tcnica considerada uma forma disciplinada de reorganizar o cdigo facilitando o reso e diminuindo o tempo gasto com as tarefas de manuteno. O objetivo geral deste artigo verificar as implicaes da tcnica de refatorao em desenvolvimento e manuteno de software, analisando suas aplicaes em sistemas Java e a contribuio em manuteno e desenvolvimento de software.

Palavras-Chave: Refatorao, Manuteno de Software e Desenvolvimento


de Software.

Abstract
It is estimated that about 50% of time for a software engineer is spent on maintenance tasks and understanding of code. The technique of refactoring is the process of changing a software to improve their internal quality preserving its behavior. So this technique is considered a disciplined way to reorganize the code easier to reuse and reducing time spent on maintenance tasks. The overall objective of this paper is to examine the implications of the technique of refactoring in developing and maintaining software applications by analyzing their contribution to Java and systems maintenance and software development.

Key-Words: Refactoring, Software Maintenance and Software Development.

* Programador Delphi Developer Gera 3 Sistemas Graduando em Analise e Desenvolvimento de Sistemas Faculdade de Tecnologia do Nordeste E-mail: leonel@gera3.com.br

Introduo

O custo e a complexidade de se manter um Software so amplamente reconhecidos. Estima-se que cerca de 50% do tempo de um engenheiro de Software gasto com tarefas de manuteno e compreenso de cdigo e que ao longo das ltimas trs dcadas, mais de 60% dos custos de desenvolvimento de Software das organizaes foram gastos com manuteno. Refatorao o processo de mudar um Software de tal forma que melhore a estrutura interna, sem com isso, alterar o comportamento externo. Portanto, uma forma disciplinada de reorganizar o cdigo, minimizando as chances de introduzir erros. Refatorar tem a vantagem de melhorar a estrutura do cdigo, facilitando o reso e diminuindo o tempo gasto com tarefas de manuteno. O termo refatorao aplicado a sistemas orientados a objetos; para outros paradigmas de programao esse mesmo processo descrito como reestruturao (MAIA, 2004). A refatorao ajuda a tornar o cdigo mais legvel e a resolver problemas de cdigos mal escritos. J no contexto da evoluo de Software, a refatorao usada para melhorar os atributos de qualidade como extensibilidade, modularidade e reusabilidade. O tema deste artigo avaliao das implicaes da tcnica de refatorao em desenvolvimento e manuteno de software. Partindo-se desse contexto, segue a seguinte questo: quais as implicaes da tcnica de refatorao em desenvolvimento e manuteno de software? Auxilia no desenvolvimento de sistemas orientados a objetos, implementados na linguagem Java que possuem baixa reusabilidade de cdigo, manuteno difcil e onde a adio ou adequao de novos requisitos demande muito esforo de um engenheiro de software, programador e analista de sistemas, posto que podem gerar grande custo ao projeto. Refatorando esses sistemas, objetiva-se aumentar manutenibilidade, reusabilidade e o tempo de vida. Com a tcnica de refatorao aplicada no desenvolvimento de software, estima-se uma diminuio nos atrasos dos projetos e a facilidade no processo de manuteno contribuindo desse modo para o mercado levando em conta custo x beneficio para as organizaes. Sero apresentados conceitos e tcnicas que demonstrem como, quando e em quais reas devem ser aplicadas a refatorao em software, a fim de contribuir para o desenvolvimento e manuteno.

Desenvolvimento
Pode-se afirmar que, para obter a qualidade de um software, no se deve apenas focar na usabilidade, mais principalmente no corao do software, o cdigo. Segundo Geek (2008), qualidade no apenas um diferencial de mercado para a empresa conseguir vender e lucrar mais, um pr-requisito que a empresa deve conquistar para conseguir colocar o produto no mercado global. Na rea de software, a qualidade crtica para sobrevivncia e sucesso no mercado que est desenvolvendo-se de forma global. Uma organizao no sobressair no mercado global, a menos que produza software de boa qualidade e seus clientes percebam essa qualidade. Segundo McCall (1977, apud PRESSMAN, 2006), os fatores de qualidade de um software concentra-se em trs aspectos importantes: suas caractersticas operacionais, sua habilidade de passar por modificaes e sua adaptabilidade a novos ambientes. J a manuteno de um software (PRESSMAN, 2006) pode ser responsvel por mais de 70% de todo o esforo despendido por uma organizao de Tecnologia da Informao voltada para desenvolvimento. Essa porcentagem continua aumentando medida que mais softwares so produzidos. Para este autor, manuteno de software bem mais que consertar erros. Cerca de 20% de todo trabalho de manuteno gasto consertando erros e os 80% restantes, so gastos adaptando sistemas existentes a modificaes no seu ambiente externo, fazendo melhorias solicitadas por usurio e submetendo uma aplicao reengenharia para uso futuro. Quando a manuteno abrange todas essas atividades, relativamente fcil ver porque absorve tanto esforo. Para Pressman (2006), h quatro atividades que so levadas a efeito depois que o software liberado para uso. So elas:
Manuteno: ocorre porque no razovel presumir que, as atividades de testes do software apresentaro todos os erros latentes num grande sistema. Durante o uso de qualquer programa, erros ocorrero, e sero relatados a desenvolvedores; Mudana rpida: no aspecto da computao com novos sistemas operacionais, novas geraes de hardware por exemplo; Um software bem-sucedido: medida que o software usado, recomendaes de novas capacidades de modificaes em funes existentes e de ampliaes gerais so recebidas dos usurios; Alterao de um software: quando acontecem alteraes para melhorar a confiabilidade ou a manutenibilidade futura, ou para oferecer uma base melhor para futuras ampliaes.

Os dois primeiros autores a reconhecer a importncia da refatorao foram Cunningham e Beck (2000 apud FOWLER, 2004), que trabalhavam com Smalltalk no processo de desenvolvimento de software a partir dos anos de 1980. Estes autores perceberam que a refatorao era importante na melhoria de sua produtividade e desde ento trabalharam com refatorao aplicando-a a projetos de software srios e refinando o processo (FOWLER, 2004). Em seguida Ralf Johnson professor na University of Illinois em Urbana-Champaing deu incio ao desenvolvimento de frameworks de software usando a tcnica de refatorao em 1992 (GAMMA; JOHNSON, 1995). Este autor explorou como a refatorao pode ajudar a desenvolver um framework eficiente e flexvel (FOWLER, 2004). Segundo Fowler (2004), outro momento que fez parte da histria da refatorao foi o estudo de um construtor de ferramentas para refatorao.

Opdyke (1992), estudante de doutorado da University of Illinois em UrbanaChampaing, investigou como as refatoraes seriam teis para o desenvolvimento de um framework em C++ que preservassem a semntica e como uma ferramenta, poderia implementar essas ideias.
Smalltalk uma linguagem de programao orientada a objeto fracamente tipada com um ambiente dinmico que permite escrever rapidamente Software altamente funcional (FOWLER, 2004). Framework um conjunto de classes implementadas em uma linguagem especifica usadas para auxiliar o desenvolvimento de Software (SCHMIDT, 1997). C++ uma linguagem de programao com o nvel de abstrao relativamente elevado, longe do cdigo da mquina e mais prximo da linguagem humana (DEITEL,2006).

Brant e Roberts (2004) levaram as ideias das ferramentas na refatorao muito mais longe, produzindo uma ferramenta de refatorao para Smalltalk. Esses autores estenderam o conceito de refatorao de Opdyke (1992), acrescentando ps-condies que cada refatorao deve obedecer. Essas pscondies descrevem o que deve ou no haver depois da aplicao da refatorao e podem ser usadas para derivar pr-condies de refatoraes compostas, calcular dependncias entre refatoraes e realizar a quantidade de anlises que refatoraes posteriores em uma sequncia devem realizar para garantir que preservem o comportamento (FOWLER, 2004). Uma metodologia que foi responsvel pelo crescimento da visibilidade da refatorao foi Extreme Programming (XP). Nessa metodologia, deve aplicar refatoraes at que o caso de uso possa ser implementado de uma maneira coerente. Um dos principais pilares de XP a continua e agressiva aplicao de refatoraes. Sem elas, essa metodologia no funcionaria (MAIA, 2004). Aplicando a refatorao em cdigo Java: De acordo com as tcnicas apresentadas por Fowler (2004), a apresentao das refatoraes ser feita da seguinte forma: a) Nome: ser dado um nome ao caso de refatorao, sendo que este deve dar uma ideia do que o mtodo faz e servir de referncia em outras partes desse trabalho; b) Motivao: diz por que o mtodo deve ser utilizado ou no deve; c) Mecnica: uma enumerao dos passos que devem ser seguidos a fim de utilizar com sucesso a refatorao em questo. d) Exemplo: ser feita uma breve descrio de quando esse mtodo deve ser usado e uma breve explicao do mtodo em questo; Extrair Mtodo: Essa tcnica de refatorao usada quando se tem um fragmento de cdigo que pode ser agrupado, transformando esse em um mtodo (FOWLER, 2004). Motivao: De acordo com Fowler (2004) quando se tm um mtodo muito longo ou um cdigo que precise de um comentrio para ter seu propsito compreendido. Segundo este autor deve-se transformar esse fragmento de cdigo em um mtodo, e de preferncia que seja um mtodo curto e com nome apropriado j que isso favorece a legibilidade do cdigo. Mecnica: A seguir sero apresentados os passos para executar a tcnica de refatorao Extrair mtodo. a) Um novo mtodo deve ser criado, lembrando que o nome desses deve ser condizente com o que ele faz.

b) Copiar o cdigo extrado para o novo mtodo. c) Procurar no cdigo extrado referncias a variveis locais no escopo do mtodo de origem. Essas variveis locais podem ser parmetros do mtodo de origem, alm das prprias variveis locais desse mtodo. d) Verificar a existncia de variveis locais apenas dentro do trecho extrado. Caso positivo, as declare como variveis temporrias dentro do novo mtodo. e) Verificar se algumas das variveis locais so modificas no trecho de cdigo extrado. Caso positivo, verifique se o cdigo extrado pode ser tratado como uma consulta e atribua o valor da consulta varivel local em questo. f) Passar como parmetro as variveis de escopo locais que sejam lidas pelo cdigo extrado. g) Substituir o cdigo extrado no mtodo de origem por uma chamada do novo mtodo; h) Compilar e testar. Exemplo:
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] = "Leonel Arajo"; row[1] = "Programador"; row[2] = "Fortaleza"; row[3] = 3000.00; row[4] = 360.00; objTable.Rows.Add(row); row = objTable.NewRow(); row[0] = "Deborah Lima"; row[1] = "Analista de Requisitos"; row[2] = "Fortaleza"; row[3] = 3000.00; row[4] = 312.00; objTable.Rows.Add(row); foreach (DataRow objRow in objTable.Rows) { Console.WriteLine("Nome: " + objRow[0].ToString()); Console.WriteLine("Profisso: " + objRow[1].ToString()); Console.WriteLine("Cidade: " + objRow[2].ToString()); Console.WriteLine("Salrio: " + ((double)objRow[3] (double)objRow[4]).ToString()); Console.WriteLine(""); } }

O cdigo acima, apesar de ser apenas um simples exemplo poder ser refatorado tornando o melhor. Para aplicar o extrair mtodo (Extract Method), seguirei as seguintes regras: Separar o trecho de cdigo do mtodo pai, para o novo mtodo dando um nome bem claro sobre seu objetivo a este novo mtodo. Remover as variveis locais do escopo do mtodo pai para o novo mtodo, desde que logicamente no interfira no cdigo pai. Passar as variveis que so alteradas pelo mtodo pai e utilizadas no mtodo extrado como parmetros desta. Aplicando a tcnica acima podemos refatorar o nosso cdigo 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("Profisso: " + row[1].ToString()); Console.WriteLine("Cidade: " + row[2].ToString()); Console.WriteLine("Salrio: " + CalculaSalario(row).ToString()); Console.WriteLine(""); } static void Main(string[] args) { DataTable objTable = ObtemDataTable(); DataRow row; row = objTable.NewRow(); row[0] = "Leonel Arajo"; row[1] = "Programador"; row[2] = "Fortaleza"; row[3] = 3000.00; row[4] = 360.00; objTable.Rows.Add(row); row = objTable.NewRow(); row[0] = "Deborah Lima"; row[1] = "Analista de Requisitos"; row[2] = "Fortaleza"; row[3] = 3000.00; row[4] = 312.00;

objTable.Rows.Add(row); foreach (DataRow objRow in objTable.Rows) { ImprimirDados(objRow); } }

Com essa tcnica aparentemente simples posso destacar muitos ganhos: Pode-se eliminar duplicidade em nosso cdigo por criar mtodos para trechos que se repetem. Tornar o cdigo mais legvel e de fcil entendimento para outros desenvolvedores. Quando decompe nosso cdigo em pequenas partes tornamos mais fcil o entendimento da lgica.

Consideraes finais
Sobre o assunto abordado, pude concluir que a tcnica de refatorao pode ser aplicada no desenvolvimento e manuteno do software, uma vez que, como demonstrado ao longo do texto, pode auxiliar os engenheiros e programadores no processo de desenvolvimento e manuteno preventiva de Software, a refatorao possibilita o acrscimo de nova funcionalidade de maneira fcil evitando a desestruturao do cdigo, j que propicia a legibilidade a nvel de cdigo e com o uso da refatorao se gasta menor tempo no processo de manuteno em relao ao cdigo anterior, j que com a tcnica remove as duplicidades, comentrios desnecessrios, estruturas condicionais difceis de ler, etc. Atravs de uma anlise quantitativa de estudos de casos da literatura existente, foi possvel ver os efeitos da tcnica de refatorao e sua influncia positiva dentro do processo de manuteno de sistemas, preservando o comportamento e facilitando a insero de novas funcionalidades, possibilitando um acrscimo rpido e fcil sem mudar o proposito a qual se destina a realizar. Para aplicao da tcnica de refatorao o engenheiro ou programador pode utilizar ferramentas que do suporte, a linguagem utilizada para o desenvolvimento do Software. Essa ainda uma rea que est em fase de crescimento, na qual estudantes e profissionais vm desenvolvendo e aprimorando as tcnicas e criando novas ferramentas para auxilio no processo de refatorao. Uma rea futura para refatorao aplicar esta tcnica em sistemas de Banco de Dados a fim de obter uma manuteno menos custosa, sendo assim, sugesto para estudos e desenvolvimento a na criao de novas ferramentas que apliquem as tcnicas de refatorao em sistemas de Banco de Dados.

Referncias

BECK, Kent. Extreme Programming Explaned. Embrace Change.2000. FOWLER, M. Refatorao Aperfeioando o Projeto de Cdigo Existente 1 edio. Porto Alegre - RS: Bookman,2004. Camilo Lopes, L. IMPLICAES DA TCNICA DE REFATORAO EM DESENVOLVIMENTO E MANUTENO DE SOFTWARE. Monografia. FACULDADE ZACARIAS DE GES, 2008. SOMMER-VILLE, L. Engenharia de Software. 1 edio. So Paulo: Pearson Addison Wesley, 2007.