Refatoração
-
Upload
eduardo-mendes-de-oliveira -
Category
Technology
-
view
907 -
download
1
description
Transcript of Refatoração
![Page 1: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/1.jpg)
Desenvolvimento Baseado em Testes
Refatoração
![Page 2: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/2.jpg)
Agenda
• Refatoração
• Exemplos
• Técnicas de Refatoração
���2
![Page 3: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/3.jpg)
Refatoração
![Page 4: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/4.jpg)
O que é?
• “É o processo de realizar mudanças em código existente e funcional sem alterar seu comportamento”
!
• Alterar COMO o código
• NÃO alterar O QUE ele faz
!
• Aprimorar a estrutura interna
![Page 5: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/5.jpg)
Qual a relação com TDD?
![Page 6: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/6.jpg)
Refatoração e TDD
• Após implementar o código mais simples para fazer o teste passar
• refatoramos o código para remover as duplicações que adicionamos para ver o teste passar
• Como temos um conjunto seguro de testes,
• então podemos refatorar com confiança
![Page 7: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/7.jpg)
O que nos motiva a refatorar?
![Page 8: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/8.jpg)
Motivação
• facilitar a adição de código novo
• melhorar o projeto existente
• obter um melhor entendimento de código
• tornar a programação menos irritante
![Page 9: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/9.jpg)
Quando refatorar?
![Page 10: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/10.jpg)
Contextos
• quando existe duplicação de código
• quando a intenção é obscura
• percebemos que o código e/ou sua intenção não são claros
• ex: lógica condicional complicada
• quando detectamos problemas de código (“bad smells”)
• ou indícios de problemas
![Page 11: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/11.jpg)
Duplicação
• Falência de um bom código
• Existem várias formas
• simples e óbvios
• índícios
• disfarçados
![Page 12: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/12.jpg)
Say Everything Once and Only Once !
Don’t Repeat Yourself
![Page 13: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/13.jpg)
Diga tudo uma vez e apenas uma vez !
Não se repita
![Page 14: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/14.jpg)
Exemplos
![Page 15: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/15.jpg)
Duplicação: 1.º exemplo
![Page 16: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/16.jpg)
def save if (arquivo.nil?) return false end diretorio = Diretorio.new(arquivo) diretorio.add(arquivo) diretorio.close() return true end
def saveAs arquivo = view.file if (arquivo.nil?) return false end diretorio = Diretorio.new(arquivo) diretorio.add(arquivo) diretorio.close() return true end
![Page 17: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/17.jpg)
def save if (arquivo.nil?) { return false } diretorio = Diretorio.new(arquivo) diretorio.add(arquivo) diretorio.close() return true end
def saveAs arquivo = view.file save end
![Page 18: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/18.jpg)
Duplicação: 2.º exemplo
![Page 19: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/19.jpg)
class MovieList def initialize @movies = [] @number_of_movies = 0 end def size @movies.size end def add movie_to_add @movies << movie_to_add @number_of_movies = @number_of_movies + 1 endend
![Page 20: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/20.jpg)
class MovieList ! def initialize @movies = [] @number_of_movies = 0 end! def size @movies.size end def add movie_to_add @movies << movie_to_add end!end
![Page 21: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/21.jpg)
Intenção obscura
![Page 22: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/22.jpg)
O que torna um código claro?
• Escolher bons nomes
• dicionário na mão para ajudar a comunicar nossa intenção
• TDD
• Como escrevemos 1º o teste, somos forçados a pensar na interface do código antes da sua implementação
• oportunidade de pensar a partir do ponto de vista do usuário da classe
![Page 23: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/23.jpg)
Problemas de código Code Smells
![Page 24: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/24.jpg)
Bad Smells• Excesso de comentários
• Classes de dados
• Código duplicado
• Intimidade inapropriada
!
!
!
• Classes muito grandes
• Classes “preguiçosas”
• Métodos longos
• Switches
![Page 25: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/25.jpg)
def init // set the layout content_pane.layout(FlowLayout.new) ! // create the list movie_list = List.new(my_editor.movies) scroller = ScrollPane.new(movie_list) content_pane.add(scroller) ! // create the field movie_field = TextField.new(16) content_pane.add(movie_field) ! // create theadd button add_button = Button.new(“Add") .... end
Excesso de comentários
![Page 26: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/26.jpg)
Classes de dadosclass Ponto attr_accessor :x, :y def initialize(x = 0, y = 0) @x = x; @y = y; end end
![Page 27: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/27.jpg)
Com intimidade
def temperatura t = estacao.termometro t.temperatura end
![Page 28: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/28.jpg)
Sem intimidade
def temperatura estacao.temperatura end
![Page 29: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/29.jpg)
Classes muito grandes
• Desproporcional às outras
• Por quê?
• tenta fazer muita coisa?
• possui muito código condicional?
• possui muito comportamento condicional?
• Como identificar?
![Page 30: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/30.jpg)
Classes “preguiçosas”
• Classes tão pequentas que não justificam sua existência
• Devem ser fundidas à outras classes
![Page 31: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/31.jpg)
Switchesclass Empregado // 0 - engenheiro, 1 - vendedor, 2 - gerente attr_accessor :tipo_empregado ! def nome_do_departamento case @tipo_empregado when 0 return "Engenheiro" when 1 return "Vendedor" when 2 return "Gerente" else return "Desconhecido" end end
end
![Page 32: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/32.jpg)
Dica
• Princípios de Orientação a objetos
• Design Patterns
![Page 33: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/33.jpg)
Como refatorar?
![Page 34: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/34.jpg)
Como refatorar
1. Estrutura de testes que proporcionem feedback
2. Pequenos passos
3. IDEs
![Page 35: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/35.jpg)
Técnicas de refatoração
![Page 36: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/36.jpg)
Refatorações• Extrair classe
• Extrair interface
• Extrair método
• Substituir código digitado por subclasses ou objeto de valor
• Substituir condicional por polimorfismo
• Utilizar métodos gabaritos
• Utilizar variavel explicativa
• Substituir construtores por métodos fábrica
• Substituir herança por delegação
• Substituir números mágicos por constantes
![Page 37: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/37.jpg)
Extrair Classe
• Contexto
• classes muito grandes
• comportamento disperso
• Solução
• fracionar as classes em pedaços menores mais coesos
• Extração de comportamentos para uma nova classe
![Page 38: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/38.jpg)
class MovieListWriter attr_accessor :destination! def initialize(aWriter = nil) destination = aWriter; end! def write_movie_list(a_list) a_list.movies.each do |movie| write_movie(movie) end end! def write_movie(a_movie) destination.write(a_movie.name) destination.write('|') destination.write(a_movie.category.to_s) destination.write('|') begin destination.write(a_movie.rating.to_s) rescue UnratedException => ex destination.write("-1") end destination.write('\n') endend
![Page 39: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/39.jpg)
class Movie // ... def write_to(destination) destination.write(name) destination.write('|') destination.write(category.to_s) destination.write('|') begin destination.write(rating.to_s) rescue UnratedException => ex destination.write("-1") end destination.write('\n'); end // ...end
![Page 40: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/40.jpg)
class MovieList write_to(destination) movies.each do |movie| movie.write_to(destination) end end end
![Page 41: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/41.jpg)
Extrair Interface
• Contexto
• Se quer abstrair a forma de uma implementação concreta
• Comportamentos importantes substituíveis ou reversíveis
• Solução
• criar interfaces para poder substituir o concreto tardiamente
![Page 42: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/42.jpg)
public class MovieList { private Collection<Movie> movies = new ArrayList<Movie>();!
public int size() { return movies.size(); } public void add(Movie movieToAdd) { movies.add(movieToAdd); }}
![Page 43: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/43.jpg)
public interface IMovieList {!
public abstract int size();!
public abstract void add(Movie movie);!
}
![Page 44: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/44.jpg)
public class MovieList implements IMovieList { //...}
![Page 45: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/45.jpg)
Strategy
![Page 46: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/46.jpg)
Extrair Método
• Contexto
• métodos muito longos
• lógicas de complexo entendimento
• Solução
• fracionar o método em métodos menores mais coesos
• Extração de comportamentos para novos métodos
![Page 47: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/47.jpg)
public void init() { getContentPane().setLayout(new FlowLayout()); movieList = new JList(myEditor.getMovies()); JScrollPane scroller = new JScrollPane(movieList); getContentPane().add(scroller); movieField = new JTextField(16); getContentPane().add(movieField); addButton = new JButton("Add"); ....
}
![Page 48: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/48.jpg)
public void init() { // set the layout getContentPane().setLayout(new FlowLayout()); ! // create the list movieList = new JList(myEditor.getMovies()); JScrollPane scroller = new JScrollPane(movieList); getContentPane().add(scroller); ! // create the field movieField = new JTextField(16); getContentPane().add(movieField); ! // create theadd button addButton = new JButton("Add"); .... }
![Page 49: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/49.jpg)
public void init() { setLayout(); initMovieList(); initMovieField(); initAddButton(); } private void setLayout() { getContentPane().setLayout(new FlowLayout()); } private void initMovieList() { movieList = new JList(getMovies()); JScrollPane scroller = new JScrollPane(movieList); getContentPane().add(scroller); } private void initMovieField() { movieField = new JTextField(16); getContentPane().add(movieField); } private void initAddButton() {...
![Page 50: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/50.jpg)
• Se um trecho de código duplicado diferentes do programa
Extrair Método 2
Classe1
![Page 51: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/51.jpg)
Extrair Método 2• Se as duplicatas de código devem permanecer
sempre iguais, ou seja, uma vez que se realize uma alteração em uma delas, as demais devem refletir a alteração
Classe1
![Page 52: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/52.jpg)
public void doGet(HttpservletRequest request, HttpServletResponse response) throws ServletException, IOException{ String p = request.getParameter(“personagem”); request.setAttribute(“personagem”, p); //Mais código } !public void doPost(HttpservletRequest request, HttpServletResponse response) throws ServletException, IOException{ String p = request.getParameter(“personagem”); request.setAttribute(“personagem”, p); //Mais código }
![Page 53: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/53.jpg)
Extraindo o método• Concentre o código que se repete em um único
lugar, por exemplo, em um método e leve as dependências para lá
public void doGet(HtttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
String p = request.getParameter(“personagem”); request.setAttribute(“personagem”, p); //Mais código }
public void novoMetodo(HtttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
String p = request.getParameter(“personagem”); request.setAttribute(“personagem”, p); //Mais código }
![Page 54: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/54.jpg)
public void novoMetodo(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{ ..... } public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{ novoMetodo(request, response); } !
public void doPost(HttpservletRequest request, HttpServletResponse response)
throws ServletException, IOException{ novoMetodo(request, response); }
![Page 55: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/55.jpg)
Refatorações• Extrair classe
• Extrair interface
• Extrair método
• Substituir código digitado por subclasses ou objetos de valor
• Substituir condicional por polimorfismo
• Utilizar métodos gabaritos
• Utilizar variavel explicativa
• Substituir construtores por métodos fábrica
• Substituir herança por delegação
• Substituir números mágicos por constantes
![Page 56: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/56.jpg)
Substituir código digitado por subclasses • Contexto
• classes indicam subtipos através de código digitado
• Solução
• Criar uma subclasse para cada alternativa
• Vantagem
• Evitam-se complexos condicionais
![Page 57: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/57.jpg)
class Empregado //0 - engenheiro, 1 - vendedor, 2 - gerente attr_accessor :tipo_do_empregado //..end
![Page 58: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/58.jpg)
class Empregado // ...end!class Engenheiro < Empregado // ...end!class Vendedor < Empregado // ...end!class Gerente < Empregado // ...end
![Page 59: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/59.jpg)
![Page 60: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/60.jpg)
Substituir condicional por polimorfismo
• Contexto
• classes indicam subtipos através de código digitado
• Solução
• Criar uma subclasse para cada alternativa
• Vantagem
• Evitam-se complexos condicionais
![Page 61: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/61.jpg)
public class Empregado // 0 - engenheiro, 1 - vendedor, 2 - gerente attr_accessor :tipo_do_empregado! def nome_do_departamento case @tipoDoEmpregado when 0 return "Engenharia" when 1 return "Vendas" when 2 return "Gerência" else return "Desconhecido" end endend
![Page 62: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/62.jpg)
class Empregado def nome_do_departamento endend!class Engenheiro < Empregado def nome_do_departamento "Engenharia" endend!class Vendedor < Empregado def nome_do_departamento "Vendas" endend!class Gerente extends Empregado def nome_do_departamento "Gerência" endend
![Page 63: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/63.jpg)
Utilizar métodos gabaritos
• Contexto
• métodos em subclasses executam passos similares na mesma ordem
• os passos são diferentes
• Solução
• extraia os passos para métodos com mesma assinatura
• crie um método gabarito final na superclasse
• especialize os métodos nas subclasses
![Page 64: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/64.jpg)
Contextopublic class Cafe { public void prepararReceita(){ ferverAgua(); misturarCafeComAgua(); servirNaXicara(); adicionarAcucarELeite(); }
!
!
!!!
public class Cha { ! public void prepararReceita(){ ferverAgua(); misturarChaComAgua(); servirNaXicara(); adicionarLimao(); }
![Page 65: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/65.jpg)
![Page 66: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/66.jpg)
Utilizar variáveis explicativas
• Contexto
• expressões complexas de se entender
• Solução
• extrair partes delas
• guardar resultados intermediários em variáveis bem nomeadas
• Vantagem
• código de melhor entendimento
![Page 67: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/67.jpg)
def calcular_total subtotal.mais(subtotal_taxavel.vezes(0.15))) .menos((subtotal().to_f > 100.0) ? (subtotal().vezes(0.10)) : 0)end
![Page 68: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/68.jpg)
def calcular_total taxa = subtotal_taxavel().vezes(0.15) total = subtotal.mais(taxa) qualificado_ao_desconto = subtotal.to_f > 100.0 desconto = qualificadoAoDesconto ? subtotal.vezes(0.10) : Dinheiro.new(0.0) total.menos(desconto)}
![Page 69: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/69.jpg)
Substituir construtor por métodos fábrica
• Contexto
• existência de diversos construtores para criar versões diferentes dos objetos
• pode haver confusão por falta de clareza de intenção do construtor
• Solução
• criar métodos fábrica estáticos
• Vantagem
• código de melhor entendimento
![Page 70: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/70.jpg)
![Page 71: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/71.jpg)
Como fazer• Execute um Extrair Método para isolar a lógica do
comportamento
• o método deve ser de classe
• repasse as dependências
• Teste
• Se o método fábrica não estiver no objeto desejado, utilize o Mover Método
• Teste
• Remova o construtor original se não há chamadas a ele
![Page 72: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/72.jpg)
Extrair Método
![Page 73: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/73.jpg)
![Page 74: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/74.jpg)
![Page 75: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/75.jpg)
Mover Método
![Page 76: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/76.jpg)
![Page 77: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/77.jpg)
Outra maneira Java
![Page 78: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/78.jpg)
public class Avaliacao { private int valor = 0; private String revisor = null; private String revista = null;! public Avaliacao(int umaAvaliacao) { this(umaAvaliacao, "Anonimo", ""); }! public Avaliacao(int umaAvaliacao, String umRevisor) { this(umaAvaliacao, umRevisor, ""); }! public Avaliacao( int umaAvaliacao, String umRevisor, String umaRevista) { valor = umaAvaliacao; revisor = umRevisor; revista = umaRevista; } // ...}
![Page 79: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/79.jpg)
public static Avaliacao novaAvaliacaoAnonima(int valor) { return new Avaliacao(valor, "Anonimo", "");}!public static Avaliacao novaAvaliacao(int valor, String revisor) { return new Avaliacao(valor, revisor, "");}!public static Avaliacao novaCritica( int valor, String revisor, String revista) { return new Avaliacao(valor, revisor, revista);}!private Avaliacao( int umaAvaliacao, String umRevisor, String umaRevista) { valor = umaAvaliacao; revisor = umRevisor; revista = umaRevista;}
![Page 80: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/80.jpg)
starWars.adicionarAvaliacao(new Avaliacao(2));starWars.adicionarAvaliacao(new Avaliacao(4, "Joel Barbosa"));starWars.adicionarAvaliacao( new Avaliacao(5, "PH Santos", "TechTudo"));
![Page 81: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/81.jpg)
starWars.adicionarAvaliacao( Avaliacao.novaAvaliacaoAnonima(2));!starWars.adicionarAvaliacao( Avaliacao.novaAvaliacao(4, "Joel Barbosa"));!starWars.adicionarAvaliacao( Avaliacao.novaCritica(5, "PH Santos", "TechTudo"));
![Page 82: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/82.jpg)
Substituir herança por delegação
• Contexto
• uma subclasse utiliza apenas uma parte da interface de sua superclasse e não reutiliza os dados
• Solução
• crie um campo do tipo da superclasse
• refatore os métodos que utilizam o comportamento da superclasse
• remova a herança
![Page 83: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/83.jpg)
![Page 84: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/84.jpg)
![Page 85: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/85.jpg)
Substituir números mágicos por constantes ou enums
• Contexto
• valores literais no código que possuem um significado
• Solução
• crie uma constante e nomeie-a com o seu significado
• substitua os valores literais pelas constantes
• Vantagem
• código de melhor entendimento
![Page 86: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/86.jpg)
def energia_potencial(massa, altura) massa * altura * 9.81end
![Page 87: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/87.jpg)
CONSTANTE_GRAVITACIONAL = 9.81 def energia_potencial(massa, altura) massa * altura * CONSTANTE_GRAVITACIONAL end
![Page 88: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/88.jpg)
Resumo
• Um pouco de refatoração
• o que é
• técnicas específicas
• alguns indicadores
• Existe problema?
• Deve-se refatorar em pequenos incrementos
![Page 89: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/89.jpg)
Bibliografia
• ASTELS, David. Test-Driven Development: A Pratical Guide. Prentice Hall, 2003.
• FOWLER, Martin; BECK, Kent; BRANT, John; Opdyke, William; ROBERTS, Don. Refactoring: Improving The Design of Existing Code.
• KERIEVSKY, Joshua. Refatoração Para Padrões. Porto Alegre: Bookman, 2008.
![Page 90: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/90.jpg)
![Page 91: Refatoração](https://reader030.fdocumentos.com/reader030/viewer/2022020218/55799ebcd8b42ac1148b4662/html5/thumbnails/91.jpg)
Bibliografia
• ASTELS, David. Test-Driven Development: A Pratical Guide. Prentice Hall, 2003.
• FOWLER, Martin; BECK, Kent; BRANT, John; Opdyke, William; ROBERTS, Don. Refactoring: Improving The Design of Existing Code.
• KERIEVSKY, Joshua. Refatoração Para Padrões. Porto Alegre: Bookman, 2008.