Introducao a refatoracao

111

Transcript of Introducao a refatoracao

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 original2. 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/refactoringhttp://refactoring.guru/