Refatoração:
Melhorando a Qualidade
de Código Pré-Existente
Cursos de Verão 2008 – IME/USP
www.agilcoop.org.br
Refatoração
● Uma modificação no sistema que não altera o
seu comportamento funcional, mas melhora sua estrutura interna.
● Limpa o código minimizando as chances de
introduzir erros.
● Melhorar o design depois que o código foi
copyleft agilcoop 2008 3
De onde vem?
● Surgiu na comunidade de Smalltalk nos anos
80/90.
● Desenvolveu-se formalmente na Universidade de
Illinois em Urbana-Champaign.
● Grupo do Prof. Ralph Johnson.
– Tese de PhD de William Opdyke (1992). – John Brant e Don Roberts:
● The Refactoring Browser Tool
O espírito da refatoração
copyleft agilcoop 2008 5
O espírito da refatoração
(refatoração)
O espírito da refatoração
(refatoração)
copyleft agilcoop 2008 7
Extrair método
● Transforma um fragmento de código em um
método com um nome explicativo.
● Motivação:
– Diminuir e facilitar o entendimento de trecho de
código.
– Aumentar as chances de reutilização do novo
copyleft agilcoop 2008 9
Renomear variável
● Muda o nome de uma variável para expressar
melhor o seu propósito
● Motivação:
– Não é fácil entender a função da variável em seu
Dinâmica da refatoração
● Cada mudança é simples...
● Mas seu efeito acumulado pode melhorar muito
o design e o código
● É construindo o sistema que podemos
copyleft agilcoop 2008 11
Refatorar para...
● Melhorar o design do software
● Tornar o software mais fácil de entender ● Encontrar falhas mais facilmente
Quando refatorar
● Sempre que você precisar fazer algo e o código
estiver atrapalhando:
– Na terceira vez, refatore
– Quando adiciona funcionalidade – Quando corrige um erro
– Quando revisa o código
● Quando o código cheira mau
– “If it stinks, change it.” (Se feder, troque-o.)
copyleft agilcoop 2008 13
Alguns maus cheiros
● Nomes de variáveis obscuros ● Código duplicado
● Método muito longo ● Classe muito grande
● Intimidade inapropriada ● Comentários
Primeiro passo: testes
● Antes de refatorar, tenha um conjunto sólido de
testes para garantir que o comportamento não seja alterado.
● Refatorações podem adicionar erros.
– porém, como são feitas em pequenos passos, é
fácil recuperar-se de uma falha
● Os testes ajudam a detectar erros se eles
forem criados.
● Testes têm que ser automáticos e ser capazes
copyleft agilcoop 2008 15
Mover método
● Move um método que utiliza mais
funcionalidades de outra classe do que aquela em que se encontra.
● Motivação:
– Uma classe tem muitos comportamentos – O acoplamento entre classes é muito forte
copyleft agilcoop 2008 17
Substituir temporário com chamada
● Substitui o uso de um variável por uma
chamada a um método que realiza as operações.
● Motivação:
– Variáveis temporárias incentivam seu uso
copyleft agilcoop 2008 19
E o desempenho?
"We should forget about small efficiencies, say about 97% of
the time: premature optimization is the root of all evil."
(Devemos esquecer as pequenas eficiências em 97% do tempo: otimização prematura é a raiz de todo o mal.)
Donald Knuth
● Usar profiling para encontrar os gargalos ● Otimizar apenas estes gargalos
● Código fatorado:
– Compra tempo para otimizar
copyleft agilcoop 2008 21
Dois chapéus
● Refatoração ● Adicionando
funcionalidades
Problemas com refatorações
● Refatoração de sistemas grandes ou enormes ● Refatoração com bancos de dados
● Refatoração de APIs públicas ● Quando NÃO refatorar?
– Quando é tão ruim que reescrever é melhor – Quando você está próximo de um prazo!
copyleft agilcoop 2008 23
Catálogo de Refatorações
● [Fowler, 2000] “Refatoração”, contém 72
refatorações.
● Análogo aos padrões de desenho orientado a
objetos [Gamma et al. 1995] (GoF).
● [Kerievsky, 2004] “Refactoring to patterns”,
catálogo com 27 refatorações que aplicam padrões!
Formato de refatorações nos
catálogos
● Nome da refatoração.
● Resumo da situação na qual ela é necessária
e o que ela faz.
● Motivação para usá-la (e quando não usá-la).
● Mecânica, i.e., descrição passo a passo.
copyleft agilcoop 2008 25
Ferramentas para Refatoração
● Refactoring Browser Tool.
● Dá suporte automatizado para uma série de
refatorações.
● Pode melhorar em muito a produtividade. ● Existem há vários anos para Smalltalk.
● Já há várias para C++ e Java.
● Iniciativas acadêmicas (Ralph@UIUC).
Referências
● www.refactoring.com
● Martin Fowler. Refactoring: improving the
design of existing code.