Material elaborado a partir de slides dos professores Dr. Alfredo Goldman e Dr. Fbio Kon DCC/IME/USP
Conceito
Refatorao o processo de mudana do design uma aplicao sem modificar o seu comportamento original [Opdyke, 1992 apud Mens eTourw, 2004]. Uma [pequena] modificao no sistema que no altera o seu comportamento funcional, mas que melhora alguma qualidade nofuncional.
Conceito
Possveis aspectos de qualidade no-funcional melhorados:
Exemplos de refatorao
Mudana do nome de variveis Mudanas nas interfaces dos objetos Pequenas mudanas arquiteturais Encapsular cdigo repetido em um novo mtodo Generalizao de mtodos
Refatorao
Em geral, uma refatorao to simples que parece que no vai ajudar muito. Mas quando se juntam 50 refatoraes, bem escolhidas, em seqncia, o cdigo melhora radicalmente.
Refatorao
Cada refatorao simples. Demora alguns segundos ou alguns poucos minutos para ser realizado. uma operao sistemtica e bvia (ovo de Colombo). O segredo est em ter um bom vocabulrio de refatoraes e saber aplic-las criteriosa e sistematicamente.
sua responsabilidade avaliar a situao e decidir quando a hora de optar por um ou por outro.
Origens
Surgiu na comunidade de Smalltalk nos anos 80/90. Desenvolveu-se formalmente na Universidade de
Illinois em Urbana-Champaign.
Estado Atual
Hoje em dia um dos preceitos bsicos de Programao eXtrema (XP). Mas no est limitado a XP, qualquer um pode (e deve) usar em qualquer contexto. No limitado a Smalltalk. Pode ser usado em qualquer linguagem [orientada a objetos].
Catlogo de Refatoraes
[Fowler, 2000] contm 72 refatoraes. Vale a pena gastar algumas horas com [Fowler, 2000]. Anlogo aos padres de projeto orientado a objetos [Gamma et al. 2000] (GoF).
Mau cheiro
Cunhada por Beck [Fowler, 2000], o termo mau cheiro (bad smell) refere-se s estruturas no cdigo que sugerem (s vezes gritam pela) possibilidade de refatorao. A partir da identificao de um mau cheiro possvel propor refatoraes adequadas, que podem reduzir ou mesmo eliminar o maucheiro.
Mau Cheiro
Cheiro Cdigo duplicado Mtodo muito longo Classe muito grande
Refatorao a ser aplicada
Intimidade inapropriada
Extract Method (110) Substitute Algorithm (139) Extract Method (110) Replace Temp With Query (120) Introduce Parameter Object (295) Extract Class (149) Extract Subclass (330) Extract Interface (341) Duplicate Observed Data (189) Move Method (142) Move Field (146) Replace Inheritance with Delegation(352)
Crie um novo mtodo e escolha um nome que explicite a sua inteno (o nome deve dizer o que ele faz, no como ele faz). Copie o cdigo do mtodo original para o novo.
Compile e teste.
Verifique se o mtodo no polimrfico ou se as suas subclasses o especializam. Ache todas as chamadas e substitua pela implementao. Compile e teste. Remova a definio do mtodo. Dica: se for difcil -> no faa.
Declare temp como final Compile (para ter certeza) Extraia a expresso
Mtodo privado - efeitos colaterais
Compile e teste
double getPreco() { final double fatorDesconto; if (precoBase() > 1000) fatorDesconto = 0.95; //2 else fatorDesconto = 0.98; return precoBase() * fatorDesconto; } private int precoBase() { return _quantidade * _precoItem; }
double getPreco() { return precoBase() * fatorDesconto(); } private int fatorDesconto() { if (precoBase() > 1000) return 0.95; return 0.98; } private int precoBase() { return _quantidade * _precoItem; }
Replace Inheritance With Delegation (352) Resumo: Quando uma subclasse s usa
parte da funcionalidade da superclasse ou no precisa herdar dados: na subclasse, crie um campo para a superclasse, ajuste os mtodos apropriados para delegar para a ex-superclasse e remova a herana.
Crie um campo na subclasse que se refere a uma instncia da superclasse, inicialize-o com this Mude cada mtodo na subclasse para que use o campo delegado Compile e teste aps mudar cada mtodo
Cuidado com as chamadas a super
Remova a herana e crie um novo objeto da superclasse Para cada mtodo da superclasse utilizado, adicione um mtodo delegado Compile e teste
Escolha que classe ser eliminada: a superclasse ou a subclasse Use Pull Up Field (320) and Pull Up Method (322) ou Push Down Method (328) e Push Down Field (329) para mover todo o comportamento e dados da classe a ser eliminada Compile e teste a cada movimento Ajuste as referncias classe que ser eliminada
isto afeta: declaraes, tipos de parmetros e construtores.
Class A
http://sourcemaking.com/refactoring/extract-interface
Inspecione todos os atributos candidatos para ver se no so usados de forma similar. Se os atributos no tm o mesmo nome, d-lhe o nome que vai ser usado quando ele subir para a superclasse. Compile e teste. Crie um novo atributo na superclasse. Se o atributo era privado nas subclasses, deve-se coloc-lo como protegido na superclasse. Apague o atributo nas subclasses. Compile e teste.
http://sourcemaking.com/refactoring/extract-interface
Class A
Class A tipo
Class B tipo
Extract Interface
Resumo: Vrios clientes usam o mesmo subconjunto da
interface da classe, ou vrias classes tm partes de suas interfaces em comum.
Extract Interface
Mecnica:
Crie uma interface vazia. Declare as operaes comuns na interface. Declare as classes relevantes que devem implementar a interface. Ajuste as declaraes de tipos nos clientes para usar a interface.
http://sourcemaking.com/refactoring/extract-interface
Extract Interface
Esquema
interface
Class B M1( ) M2( ) M3( ) M4( ) M5( ) M6( ) Class B M1( ) M2( ) M3( ) M4( ) M5( ) M6( )
Princpios Bsicos
Refatorao muda o programa em passos pequenos. Se voc comete um erro, fcil consertar. Qualquer um pode escrever cdigo que o computador consegue entender. Bons programadores escrevem cdigo que pessoas conseguem entender. Trs repeties? Est na hora de refatorar. Quando voc sente que preciso escrever um comentrio para explicar o cdigo melhor, tente refatorar primeiro.
Concluses
Refatorao uma tcnica para tornar software mais simples, mais fceis de serem entendidos mais manutenvel. Consiste de modificaes simples, que no alteram a funcionalidade do cdigo, mas que realizadas repetidamente melhoram muito o software. Refatoraes foram catalogadas para uso sistemtico e so apoiadas por ferramentas.
Bibliografia
Erich Gamma et al. Padres de Projeto Solues reutilizveis de software orientado a objetos, Bookman, 2000. Martin Fowler. Refactoring: improving the design of existing code. Addison-Wesley. 2000. Tom Mens e Tom Tourw, A Survey of Software Refactoring, IEEE Transactions on Software Engineering, 30(2): 126-139, 2004. Tom Tourw e Tom Mens, Identifying Refactoring Opportunities Using Logic Meta Programming, Proceedings of the Seventh European Conference on Software Maintenance and Reegineering (CSMR 03), 2003. William F. Opdyke, Refactoring Object-oriented Frameworks. Ph.D thesis, University of Illinois at Urbana-Champaign, 1992.
Informaes
www.refactoring.com www.ime.usp.br/~kon/presentations