FOWLER, M. Refactoring: Improving the design of
existing code. Boston, MA:Addison-Wesley, 1999.
http://staruml.io/
http://www.uml-lab.com/en/uml-lab/academic/
http://plugins.netbeans.org/plugin/55435/easyuml
Obs.: o teste completo deve exercitar todas as
alternativas previstas nas regras de negócio
Eclipse
NetBeans
Eclipse
NetBeans
Se houver algum problema:
Engano (proposital)
Combinando todos os casos de teste em uma suíte de testes:
Eclipse
NetBeans
Quando for necessário alterar o código e ele não está estruturado de modo
adequado para receber essa modificação, primeiro refatore o programa para
tornar a modificação mais fácil de ser realizada, e então faça a modificação.
Método muito longo!
• Ter mais métodos curtos
é uma opção melhor
 Mais claro
 Mais gerenciável
Quando você tem um fragmento de código que pode ser manipulado como um grupo:
Transforme o fragmento em um método cujo nome explique o propósito do método
https://refactoring.guru/extract-method
Trecho candidato:
Original:
Modificado:
Usando os recursos da IDE para refatoração
Eclipse
Qual informação
da classe Customer
é usada nesse
método?
Quando um método usa mais características de outra classe que da classe na
qual ele está alocado:
Crie um novo método com corpo similar na classe que ele mais usa.
Transforme o método original em uma delegação ou, se for o caso, remova-o.
https://refactoring.guru/move-method
Método na classe Rental:
Método na classe Customer:
NetBeans
Você tem uma variável temporária que recebe um valor uma vez a partir
de uma expressão simples e a variável temporária pode atrapalhar a
aplicação de outras refatorações:
Troque todas as referências à variável temporária pela expressão.
https://refactoring.guru/inline-temp
Verificar que atribuição é a única:
Substituir usos da variável pelo lado direito da atribuição:
E testar...
Remover a atribuição e a atribuição:
E testar...
Extrair método
Só usa dados
de Rental
Move method
Na classe Rental:
Estado atual do método statement:
Variáveis
temporárias
Você está usando uma variável temporária para manter o resultado de
uma expressão:
Extraia a expressão para um método. Substitua todas as referências
para a variável temporária pelo novo método. O novo método poderá
então ser utilizado em outros métodos
https://refactoring.guru/replace-temp-with-query
Substituindo totalAmount:
Substituindo frequentRenterPoints:
Na classe Rental:
Na classe Rental:
Escolha do switch é feito com
base em um atributo de Movie
(não é uma boa estratégia...)
e mais alguns ajustes...
Classe Movie:
Classe Rental:
O mesmo ocorre com o método getFrequentRenterPoints():
Adicionalmente: coisas que variam juntas devem estar juntas
Na classe Movie:
Na classe Rental:
Você tem um código de tipo que afeta o comportamento de uma
classe, mas você não pode usar herança diretamente:
Substitua o código de tipo com um objeto de estado
https://refactoring.guru/replace-type-code-with-state-strategy
Você está acessando um atributo diretamente, mas o forte
acoplamento em relação a esse atributo está se tornando problemático:
Crie métodos get...() e set...() para esse atributo e use apenas esses
métodos para acessar o atributo
https://refactoring.guru/self-encapsulate-field
Aplicando ao código, na classe Movie:
Adicionar as novas classes:
Mudar os métodos de set() e get() para usar as novas classes:
Mover o método getCharge() para a classe Price:
Na classe Movie: Na classe Price:
Substituir condicional com polimorfismo:
1. Para cada case do switch, criar um método que
sobrescreve o método original
2. Compilar e testar
Agora, o método getCharge() de Price pode ser
declarado como abstract:
Seguindo o mesmo procedimento para getFrequentRenterPoints()
• Mover o método para a classe Price:
Na classe Movie:
Na classe Price:
Comportamento para lançamentos (New release):
sobrescreve o método na classe NewReleasePrice
Comportamento para os demais tipos de filmes (Regular, Infantil):
Utiliza o método padrão (manter na classe Price)
Diagrama de classes final:
http://staruml.io/
http://www.uml-lab.com/en/uml-lab/tutorials/
http://plugins.netbeans.org/plugin/55435/easyuml
http://junit.org/
http://courses.cs.washington.edu/courses/cse143/11wi/eclipse-
tutorial/junit.shtml
http://sourcemaking.com/refactoring
http://refactoring.guru/

Introducao a refatoracao