SlideShare uma empresa Scribd logo
1 de 111
Baixar para ler offline
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/

Mais conteúdo relacionado

Mais procurados

Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoPaula Grangeiro
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesEverton Rodrigues
 
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDDABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDDRaphael Pacheco
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Bernardo Fontes
 
TDD no Community Launch 2010 - Christian Cunha
TDD no Community Launch 2010 - Christian CunhaTDD no Community Launch 2010 - Christian Cunha
TDD no Community Launch 2010 - Christian CunhaChristian Cunha
 
C# 6.0 .net coders
C# 6.0   .net codersC# 6.0   .net coders
C# 6.0 .net codersRenato Groff
 
Boas práticas com TDD
Boas práticas com TDD Boas práticas com TDD
Boas práticas com TDD Camilo Lopes
 
Django Object factory
Django Object factoryDjango Object factory
Django Object factoryitalomaia
 
Introdução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitIntrodução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitelliando dias
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de SoftwareMaurício Aniche
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizadosThiago Ghisi
 
Por que automatizar testes de software?
Por que automatizar testes de software?Por que automatizar testes de software?
Por que automatizar testes de software?Samuel Lourenço
 
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Renato Groff
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoPaula Grangeiro
 
Pensando em java univali turbinando seus testes
Pensando em java univali   turbinando seus testesPensando em java univali   turbinando seus testes
Pensando em java univali turbinando seus testesSandro Giacomozzi
 

Mais procurados (20)

Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de código
 
Padrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por TestesPadrões para Desenvolvimento de Software Guiado por Testes
Padrões para Desenvolvimento de Software Guiado por Testes
 
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDDABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
ABAP Code Retreat Brasil - Apagando tudo e começando novamente: Conhecendo o TDD
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?
 
TDD no Community Launch 2010 - Christian Cunha
TDD no Community Launch 2010 - Christian CunhaTDD no Community Launch 2010 - Christian Cunha
TDD no Community Launch 2010 - Christian Cunha
 
C# 6.0 .net coders
C# 6.0   .net codersC# 6.0   .net coders
C# 6.0 .net coders
 
Boas práticas com TDD
Boas práticas com TDD Boas práticas com TDD
Boas práticas com TDD
 
Django Object factory
Django Object factoryDjango Object factory
Django Object factory
 
Introdução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitIntrodução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnit
 
TDD na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
Minicurso de TDD
Minicurso de TDDMinicurso de TDD
Minicurso de TDD
 
Testes Automatizados de Software
Testes Automatizados de SoftwareTestes Automatizados de Software
Testes Automatizados de Software
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizados
 
Java generics-basics
Java generics-basicsJava generics-basics
Java generics-basics
 
Por que automatizar testes de software?
Por que automatizar testes de software?Por que automatizar testes de software?
Por que automatizar testes de software?
 
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de código
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Pensando em java univali turbinando seus testes
Pensando em java univali   turbinando seus testesPensando em java univali   turbinando seus testes
Pensando em java univali turbinando seus testes
 

Semelhante a Introducao a refatoracao

Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaFernando Camargo
 
Artigo Padrões J2EE: Um exemplo de uso
Artigo Padrões J2EE: Um exemplo de usoArtigo Padrões J2EE: Um exemplo de uso
Artigo Padrões J2EE: Um exemplo de usoErivan de Sena Ramos
 
Workshop React Hooks
Workshop React HooksWorkshop React Hooks
Workshop React HooksDan Vitoriano
 
Test-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netTest-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netRenato Groff
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - IFabio Moura Pereira
 
BDD (Behavior-Driven Development)
BDD (Behavior-Driven Development)BDD (Behavior-Driven Development)
BDD (Behavior-Driven Development)Renato Groff
 
BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015Renato Groff
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshopguestd37c23
 
OCP - The Open Close Principle - Princípio aberto/fechado
OCP - The Open Close Principle - Princípio aberto/fechadoOCP - The Open Close Principle - Princípio aberto/fechado
OCP - The Open Close Principle - Princípio aberto/fechadoEngenharia de Software Ágil
 
http://www.dm.ufscar.br/~waldeck/curso/java/
http://www.dm.ufscar.br/~waldeck/curso/java/http://www.dm.ufscar.br/~waldeck/curso/java/
http://www.dm.ufscar.br/~waldeck/curso/java/Rodrigo Vieira
 
Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01Walney Negreiros
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetosCleyton Ferrari
 
Gerenciando aspectos e eventos com Zend Framework 2
Gerenciando aspectos e eventos com Zend Framework 2Gerenciando aspectos e eventos com Zend Framework 2
Gerenciando aspectos e eventos com Zend Framework 2Flávio Lisboa
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Thiago Faria de Andrade
 

Semelhante a Introducao a refatoracao (20)

Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em Java
 
Artigo Padrões J2EE: Um exemplo de uso
Artigo Padrões J2EE: Um exemplo de usoArtigo Padrões J2EE: Um exemplo de uso
Artigo Padrões J2EE: Um exemplo de uso
 
Refatoração
RefatoraçãoRefatoração
Refatoração
 
Workshop React Hooks
Workshop React HooksWorkshop React Hooks
Workshop React Hooks
 
Test-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.netTest-Driven Development (TDD) utilizando o framework xUnit.net
Test-Driven Development (TDD) utilizando o framework xUnit.net
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 
Aula5
Aula5Aula5
Aula5
 
BDD (Behavior-Driven Development)
BDD (Behavior-Driven Development)BDD (Behavior-Driven Development)
BDD (Behavior-Driven Development)
 
BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshop
 
OCP - The Open Close Principle - Princípio aberto/fechado
OCP - The Open Close Principle - Princípio aberto/fechadoOCP - The Open Close Principle - Princípio aberto/fechado
OCP - The Open Close Principle - Princípio aberto/fechado
 
http://www.dm.ufscar.br/~waldeck/curso/java/
http://www.dm.ufscar.br/~waldeck/curso/java/http://www.dm.ufscar.br/~waldeck/curso/java/
http://www.dm.ufscar.br/~waldeck/curso/java/
 
Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 
Working with legacy code 3
Working with legacy code 3Working with legacy code 3
Working with legacy code 3
 
Gerenciando aspectos e eventos com Zend Framework 2
Gerenciando aspectos e eventos com Zend Framework 2Gerenciando aspectos e eventos com Zend Framework 2
Gerenciando aspectos e eventos com Zend Framework 2
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Padrões de Projeto
Padrões de ProjetoPadrões de Projeto
Padrões de Projeto
 
Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...Test-Driven Development - Introdução ao método de construção de software guia...
Test-Driven Development - Introdução ao método de construção de software guia...
 

Mais de Ivan Ricarte

Aula catalogo de refatoracoes
Aula   catalogo de refatoracoesAula   catalogo de refatoracoes
Aula catalogo de refatoracoesIvan Ricarte
 
Testes de unidade em Java: JUnit
Testes de unidade em Java: JUnitTestes de unidade em Java: JUnit
Testes de unidade em Java: JUnitIvan Ricarte
 
Refatoração: Code smells
Refatoração: Code smellsRefatoração: Code smells
Refatoração: Code smellsIvan Ricarte
 
Aplicacoes web semantica saude
Aplicacoes web semantica saudeAplicacoes web semantica saude
Aplicacoes web semantica saudeIvan Ricarte
 
R - Software Estatistico
R - Software EstatisticoR - Software Estatistico
R - Software EstatisticoIvan Ricarte
 
Aula revisão de java e junit
Aula   revisão de java e junitAula   revisão de java e junit
Aula revisão de java e junitIvan Ricarte
 
C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1Ivan Ricarte
 
Membros de classes C++
Membros de classes C++Membros de classes C++
Membros de classes C++Ivan Ricarte
 
Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Ivan Ricarte
 
Problemas no desenvolvimento do software
Problemas no desenvolvimento do softwareProblemas no desenvolvimento do software
Problemas no desenvolvimento do softwareIvan Ricarte
 
Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Ivan Ricarte
 
SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)Ivan Ricarte
 
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeO Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeIvan Ricarte
 
Um novo paradigma para o ensino de ponteiros frente à evolução de C++
Um novo paradigma para o ensino de ponteiros frente à evolução de C++Um novo paradigma para o ensino de ponteiros frente à evolução de C++
Um novo paradigma para o ensino de ponteiros frente à evolução de C++Ivan Ricarte
 

Mais de Ivan Ricarte (20)

Aula catalogo de refatoracoes
Aula   catalogo de refatoracoesAula   catalogo de refatoracoes
Aula catalogo de refatoracoes
 
Testes de unidade em Java: JUnit
Testes de unidade em Java: JUnitTestes de unidade em Java: JUnit
Testes de unidade em Java: JUnit
 
Refatoração: Code smells
Refatoração: Code smellsRefatoração: Code smells
Refatoração: Code smells
 
Aplicacoes web semantica saude
Aplicacoes web semantica saudeAplicacoes web semantica saude
Aplicacoes web semantica saude
 
R - Software Estatistico
R - Software EstatisticoR - Software Estatistico
R - Software Estatistico
 
Aula UML e Java
Aula UML e JavaAula UML e Java
Aula UML e Java
 
Aula revisão de java e junit
Aula   revisão de java e junitAula   revisão de java e junit
Aula revisão de java e junit
 
C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1C++: biblioteca padrão de templates - Parte 1
C++: biblioteca padrão de templates - Parte 1
 
c++ construtores
c++ construtoresc++ construtores
c++ construtores
 
Padroes
PadroesPadroes
Padroes
 
C++ Sobrecarga
C++ SobrecargaC++ Sobrecarga
C++ Sobrecarga
 
Membros de classes C++
Membros de classes C++Membros de classes C++
Membros de classes C++
 
UML e POO
UML e POOUML e POO
UML e POO
 
Antipadroes
AntipadroesAntipadroes
Antipadroes
 
Princípios da organização de código fonte C++
Princípios da organização de código fonte C++Princípios da organização de código fonte C++
Princípios da organização de código fonte C++
 
Problemas no desenvolvimento do software
Problemas no desenvolvimento do softwareProblemas no desenvolvimento do software
Problemas no desenvolvimento do software
 
Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)Aula 01 - As linguagens do software (2015)
Aula 01 - As linguagens do software (2015)
 
SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)SI300 - Apoio a atividades práticas em C++ (01)
SI300 - Apoio a atividades práticas em C++ (01)
 
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeO Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúde
 
Um novo paradigma para o ensino de ponteiros frente à evolução de C++
Um novo paradigma para o ensino de ponteiros frente à evolução de C++Um novo paradigma para o ensino de ponteiros frente à evolução de C++
Um novo paradigma para o ensino de ponteiros frente à evolução de C++
 

Introducao a refatoracao