SlideShare una empresa de Scribd logo
1 de 35
Refatoração
gerson.borges@prof.una.br
Versão 14.9.1
Refatoração
• Refatoração (do inglês Refactoring) é o
processo de modificar um sistema de
software para melhorar a estrutura interna do
código sem alterar seu comportamento
externo.
• O uso desta técnica evita a deterioração tão
comum durante o ciclo de vida de um código.
• Não se trata de otimização.
Objetivo
• Prevenir o envelhecimento do design e
garantir a flexibilidade adequada para permitir
a integração tranqüila de futuras
extensões/alterações [Mens e Tourwé, 2004]
– Em geral, uma refatoração é tão simples que
parece que não vai ajudar muito.
– Mas quando se juntam 50 refatorações, bem
escolhidas, em seqüência, o código melhora
radicalmente.
Origem
• 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
• Kent Beck (XP) na indústria
Mau cheiro
• O termo mau cheiro (bad smell) refere-se às
estruturas no código que sugerem (às vezes
gritam pela) possibilidade de refatoração
[Fowler, 2000]
• A partir da identificação de um mau cheiro é
possível propor refatorações adequadas, que
podem reduzir ou mesmo eliminar o mau
cheiro
Mau cheiro
• Rigidez
– uma alteração em um ponto do código requer alterações em
cascata (dependências);
• Fragilidade
– A modificação de um ponto do código quebra outras
funcionalidades;
• Complexidade
– Arquitetura muito complexa pois foi preparada para manipular
qualquer tipo de possibilidade;
• Duplicação
– Código redundante, duplicado;
• Legibilidade
– Código difícil de compreender e entender
Código Duplicado
• Um dos problemas mais graves no código. Podem
ser duas expressões idênticas em dois métodos
na mesma classe, ou duas classes não associadas.
– Essa duplicação pode ser eliminada aplicando-se a
refatoração Extract Method. Nesse caso, o código é
implementado uma única vez e chamado no local de
origem onde estava o código duplicado.
– Se o código duplicado encontra-se em duas classes
distintas, pode-se aplicar a refatoração Extract Class.
Método Longo
• Consiste de um método com uma implementação
de lógica com várias, dezenas ou até centenas de
linhas de código.
– O ideal seria criar métodos com no máximo dez linhas
de código, podendo ser inclusive de uma a cinco.
– Vários problemas podem ser originados da
implementação de métodos longos.
• A solução é dividir o método longo em métodos
menores, usando-se a refatoração Extract
Method.
Classe larga
• Uma boa prática da programação orientada a
objetos sugere que uma classe deve ter uma
única responsabilidade (princípio da
responsabilidade única).
• Quando uma classe possui muitas instâncias no
código, isso sugere que ela está fazendo muito,
ou pelo menos realizando trabalho que deveria
ser feito por outras classes.
• Algumas refatorações podem ajudar a reduzir
classes longas, como por exemplo, Extrair Classe,
Extract Subclass, entre outras.
Lista de Parâmetros Longa
• Um método que recebe muitos parâmetros sugere que
classes possam estar compartilhando muita
informação.
• Se um método com uma longa lista de parâmetros está
sendo chamado em vários locais do código, uma
mudança em um deles pode desencadear uma cadeia
muito grande de alterações em vários locais do código.
• Algumas refatorações podem ajudar a resolver esse
problema, por exemplo “Replace Parameter with
Method” e “Introduce Parameter Object” onde uma
longa lista de parâmetros se resume a uma única
classe.
Campo temporário
• Muitas vezes um objeto tem sua variável de
instância configurada somente sobre certas
circunstâncias. Tal código é difícil de entender.
Um exemplo ocorre quando um algoritmo
depende de uma série de variáveis.
• A refatoração “Extract Class” pode minimizar
problemas associados á essas variáveis
“pobres”
Aspectos de qualidade
• Simplicidade
• Flexibilidade
• Clareza
• Desempenho
Código limpo
• Nomes significativos, que revelam sua intenção;
• Expressa o que faz, por que existe, como é usado;
• Nomes pronunciáveis;
• Notação húngara, tipo não precisa estar no
nome;
• Nomes de classes são substantivos;
• Nomes de métodos são verbos;
• Assessores devem ter “get” e “set”
Código limpo
• Métodos pequenos (5 ou 10 linhas);
• Linhas de até 100 caracteres;
• Métodos devem realizar uma única tarefa;
• Cuidar com lista longa de parâmetros;
• Classes pequenas (200 linhas);
• Seguir o princípio da responsabilidade única;
• Cuidar o acoplamento entre classes
(dependências);
• Refatore ao invés de comentar;
Extract Method (110)
• Resumo
– Você tem um fragmento de código que poderia
ser agrupado. Mude o fragmento para um novo
método e escolha um nome que explique o que
ele faz.
Extract Method (110)
• Motivação
– É uma das refatorações mais comuns. Se um
método é longo demais ou difícil de entender e
exige muitos comentários, extraia trechos do
método e crie novos métodos para eles. Isso vai
melhorar as chances de reutilização do código e
vai fazer com que os métodos que o chamam
fiquem mais fáceis de entender. O código fica
parecendo comentário.
Extract Method (110)
• Mecânica:
– Crie um novo método e escolha um nome que explicite a
sua intenção (o nome deve dizer o que ele faz, não como
ele faz).
– Copie o código do método original para o novo.
– Procure por variáveis locais e parâmetros utilizados pelo
código extraído.
• Se variáveis locais forem usadas apenas pelo código extraído,
passe-as para o novo método.
• Caso contrário, veja se o seu valor é apenas atualizado pelo
código. Neste caso substitua o código por uma atribuição.
• Se é tanto lido quando atualizado, passe-a como parâmetro.
– Compile e teste.
Inline Method (117)
• Resumo:
– A implementação de um método é tão clara
quanto o nome do método. Substitua a chamada
ao método pela sua implementação.
Inline Method (117)
• Motivação:
– Bom para eliminar indireção desnecessária. Se
você tem um grupo de métodos mal organizados,
aplique Inline Method em todos eles seguido de
uns bons Extract Methods
Inline Method (117)
• Mecânica:
– Verifique se o método não é polimórfico ou se as
suas subclasses o especializam.
– Ache todas as chamadas e substitua pela
implementação.
– Compile e teste.
– Remova a definição do método.
Replace Temp with Query (120)
• Resumo:
– Uma variável local está sendo usada para guardar
o resultado de uma expressão. Troque as
referências a esta expressão por um método.
Replace Temp with Query (120)
• Motivação:
– Variáveis temporárias encorajam métodos longos
(devido ao escopo). O código fica mais limpo e o
método pode ser usado em outros locais.
Replace Temp with Query (120)
• Mecânica:
– Encontre variáveis locais que são atribuídas uma
única vez
• Se temp é atribuída mais do que uma vez use Split
Temporary Variable (128)
– Declare temp como final
– Compile (para ter certeza)
– Extraia a expressão
• Método privado - efeitos colaterais
– Compile e teste
Replace Inheritance With
Delegation (352)
• Resumo:
– Quando uma subclasse só usa parte da
funcionalidade da superclasse ou não precisa
herdar dados: na subclasse, crie um campo para a
superclasse, ajuste os métodos apropriados para
delegar para a ex-superclasse e remova a herança.
Replace Inheritance With
Delegation (352)
• Motivação:
– Herança é uma técnica excelente, mas muitas
vezes, não é exatamente o que você quer. Às
vezes, nós começamos herdando de uma outra
classe mas daí descobrimos que precisamos
herdar muito pouco da superclasse. Descobrimos
que muitas das operações da superclasse não se
aplicam à subclasse. Neste caso, delegação é mais
apropriado.
Replace Inheritance With
Delegation (352)
• Mecânica:
– Crie um campo na subclasse que se refere a uma
instância da superclasse, inicialize-o com this
– Mude cada método na subclasse para que use o
campo delegado
– Compile e teste após mudar cada método
• Cuidado com as chamadas a super
– Remova a herança e crie um novo objeto da
superclasse
– Para cada método da superclasse utilizado, adicione
um método delegado
– Compile e teste
Collapse Hierarchy (344)
• Resumo:
– A superclasse e a subclasse não são muito
diferentes. Combine-as em apenas uma classe.
Collapse Hierarchy (344)
• Motivação:
– Depois de muito trabalhar com uma hierarquia de
classes, ela pode se tornar muito complexa.
Depois de refatorá-la movendo métodos e campos
para cima e para baixo, você pode descobrir que
uma subclasse não acrescenta nada ao seu
projeto. Remova-a.
Collapse Hierarchy (344)
• Mecânica:
– Escolha que classe será eliminada: a superclasse ou a
– subclasse
– Use Pull Up Field (320) and Pull Up Method (322) ou
Push Down Method (328) e Push Down Field (329)
para mover todo o comportamento e dados da classe
a ser eliminada
– Compile e teste a cada movimento
– Ajuste as referências à classe que será eliminada
• Isto afeta: declarações, tipos de parâmetros e construtores.
– Remova a classe vazia
– Compile e teste
Pull UP Field (320)
• Resumo:
– A superclasse e a subclasse têm os mesmos
atributos (field). Mova os atributos repetidos para
a superclasse.
Pull UP Field (320)
• Motivação:
– Subclasses desenvolvidas independentemente
umas das outras, ou após refatoração, podem ter
características (features) duplicadas. Atributos
podem ser duplicados. Estes não necessariamente
têm o mesmo nome em todas as subclasses. A
forma de determinar se tal acontece é verificar
como os atributos são usados por outros
métodos. Se eles são usados da mesma forma,
pode-se generalizá-los.
Pull UP Field (320)
• Mecânica:
– Inspecione todos os atributos candidatos para ver se
não são usados de forma similar.
– Se os atributos não têm o mesmo nome, dê-lhe o
nome que vai ser usado quando ele “subir” para a
superclasse.
– Compile e teste.
– Crie um novo atributo na superclasse.
• Se o atributo era privado nas subclasses, deve-se colocá-lo
como protegido na superclasse.
– Apague o atributo nas subclasses.
– Compile e teste.
Extract Interface
• Resumo:
– Vários clientes usam o mesmo subconjunto da
interface da classe, ou várias classes têm partes de
suas interfaces em comum.
Extract Interface
• Motivação:
– Classes usam umas às outras de várias formas. Pode-
se ter, por exemplo, um grupo de clientes usando um
subconjunto das responsabilidades da classe. E ainda,
uma classe pode colaborar com qualquer classe que
trate um certo grupo de requisições. Nestes casos, é
útil transformar esse subconjunto de
responsabilidades em algo com existência própria,
para ficar claro e explícito seu uso no sistema. Dessa
forma fica mais fácil de ver como as responsabilidades
se dividem. E também, ao se inserir novas classes que
implementem esse subconjunto, fica mais fácil de ver
o que se encaixa nesse subconjunto.
Extract Interface
• Mecânica:
– Crie uma interface vazia.
– Declare as operações comuns na interface.
– Declare as classes relevantes que devem
implementar a interface.
– Ajuste as declarações de tipos nos clientes para
usar a interface.
– Compile e teste.

Más contenido relacionado

La actualidad más candente

Curso Java Básico - Aula 04
Curso Java Básico - Aula 04Curso Java Básico - Aula 04
Curso Java Básico - Aula 04
Natanael Fonseca
 

La actualidad más candente (20)

Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Curso Java Básico - Aula02
Curso Java Básico - Aula02Curso Java Básico - Aula02
Curso Java Básico - Aula02
 
Aula 02 Primeiro Cod Java
Aula 02   Primeiro Cod JavaAula 02   Primeiro Cod Java
Aula 02 Primeiro Cod Java
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01
 
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...
 
Curso Java Básico - Aula 04
Curso Java Básico - Aula 04Curso Java Básico - Aula 04
Curso Java Básico - Aula 04
 
Aula 2 conversao de variaveis j option-pane
Aula 2   conversao de variaveis j option-paneAula 2   conversao de variaveis j option-pane
Aula 2 conversao de variaveis j option-pane
 
Aula 3 introducao a orientação a objetos
Aula 3   introducao a orientação a objetosAula 3   introducao a orientação a objetos
Aula 3 introducao a orientação a objetos
 
Desenvolvimento de Software
Desenvolvimento de SoftwareDesenvolvimento de Software
Desenvolvimento de Software
 
Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos
 
Java 01
Java 01Java 01
Java 01
 
Erros comuns em java
Erros comuns em javaErros comuns em java
Erros comuns em java
 
Curso de java - Antonio Alves - aula 04
Curso de java - Antonio Alves -  aula 04Curso de java - Antonio Alves -  aula 04
Curso de java - Antonio Alves - aula 04
 
Aula5
Aula5Aula5
Aula5
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Revisão de C# 4.0
Revisão de C# 4.0Revisão de C# 4.0
Revisão de C# 4.0
 
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVAProgramação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
 
Apostila de Introdução a POO com C#
Apostila de Introdução a POO com C#Apostila de Introdução a POO com C#
Apostila de Introdução a POO com C#
 
Aula05
Aula05Aula05
Aula05
 

Similar a Refatoração

Similar a Refatoração (20)

Refatorações
RefatoraçõesRefatorações
Refatorações
 
Clean code em C#
Clean code em C#Clean code em C#
Clean code em C#
 
TDD na Prática
TDD na PráticaTDD na Prática
TDD na Prática
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshop
 
Clean Code - Fork In Tuba
Clean Code - Fork In TubaClean Code - Fork In Tuba
Clean Code - Fork In Tuba
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para Testers
 
Programação C - Aula 1
Programação C - Aula 1Programação C - Aula 1
Programação C - Aula 1
 
Code Smells
Code SmellsCode Smells
Code Smells
 
TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"TDD com Código Legado - "Atualizado"
TDD com Código Legado - "Atualizado"
 
Padrões de Projeto
Padrões de ProjetoPadrões de Projeto
Padrões de Projeto
 
Clean code part 2
Clean code   part 2Clean code   part 2
Clean code part 2
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
03 fundamentos java
03 fundamentos java03 fundamentos java
03 fundamentos java
 
Java aula 2
Java aula 2Java aula 2
Java aula 2
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a Objetos
 
Working with legacy code 3
Working with legacy code 3Working with legacy code 3
Working with legacy code 3
 
Codigo limpo
Codigo limpoCodigo limpo
Codigo limpo
 
Estudos Technocorp
Estudos TechnocorpEstudos Technocorp
Estudos Technocorp
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
 
Clean code
Clean codeClean code
Clean code
 

Último

Aprender as diferentes formas de classificar as habilidades motoras é de extr...
Aprender as diferentes formas de classificar as habilidades motoras é de extr...Aprender as diferentes formas de classificar as habilidades motoras é de extr...
Aprender as diferentes formas de classificar as habilidades motoras é de extr...
azulassessoria9
 
Sistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturasSistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturas
rfmbrandao
 
República Velha (República da Espada e Oligárquica)-Sala de Aula.pdf
República Velha (República da Espada e Oligárquica)-Sala de Aula.pdfRepública Velha (República da Espada e Oligárquica)-Sala de Aula.pdf
República Velha (República da Espada e Oligárquica)-Sala de Aula.pdf
LidianeLill2
 
ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
azulassessoria9
 
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdfatividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
Autonoma
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
azulassessoria9
 

Último (20)

tensoes-etnicas-na-europa-template-1.pptx
tensoes-etnicas-na-europa-template-1.pptxtensoes-etnicas-na-europa-template-1.pptx
tensoes-etnicas-na-europa-template-1.pptx
 
MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdfMESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
MESTRES DA CULTURA DE ASSARÉ Prof. Francisco Leite.pdf
 
Aula 1 - Psicologia Cognitiva, aula .ppt
Aula 1 - Psicologia Cognitiva, aula .pptAula 1 - Psicologia Cognitiva, aula .ppt
Aula 1 - Psicologia Cognitiva, aula .ppt
 
Aprender as diferentes formas de classificar as habilidades motoras é de extr...
Aprender as diferentes formas de classificar as habilidades motoras é de extr...Aprender as diferentes formas de classificar as habilidades motoras é de extr...
Aprender as diferentes formas de classificar as habilidades motoras é de extr...
 
Sistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturasSistema articular aula 4 (1).pdf articulações e junturas
Sistema articular aula 4 (1).pdf articulações e junturas
 
GUIA DE APRENDIZAGEM 2024 9º A - História 1 BI.doc
GUIA DE APRENDIZAGEM 2024 9º A - História 1 BI.docGUIA DE APRENDIZAGEM 2024 9º A - História 1 BI.doc
GUIA DE APRENDIZAGEM 2024 9º A - História 1 BI.doc
 
Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)
 
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
 
República Velha (República da Espada e Oligárquica)-Sala de Aula.pdf
República Velha (República da Espada e Oligárquica)-Sala de Aula.pdfRepública Velha (República da Espada e Oligárquica)-Sala de Aula.pdf
República Velha (República da Espada e Oligárquica)-Sala de Aula.pdf
 
Falando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introdFalando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introd
 
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
Aula 25 - A america espanhola - colonização, exploraçãp e trabalho (mita e en...
 
Slides Lição 06, Central Gospel, O Anticristo, 1Tr24.pptx
Slides Lição 06, Central Gospel, O Anticristo, 1Tr24.pptxSlides Lição 06, Central Gospel, O Anticristo, 1Tr24.pptx
Slides Lição 06, Central Gospel, O Anticristo, 1Tr24.pptx
 
M0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptxM0 Atendimento – Definição, Importância .pptx
M0 Atendimento – Definição, Importância .pptx
 
aprendizagem significatica, teórico David Ausubel
aprendizagem significatica, teórico David Ausubelaprendizagem significatica, teórico David Ausubel
aprendizagem significatica, teórico David Ausubel
 
ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 3 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdfatividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
 
Polígonos, Diagonais de um Polígono, SOMA DOS ANGULOS INTERNOS DE UM POLÍGON...
Polígonos, Diagonais de um Polígono, SOMA DOS ANGULOS INTERNOS DE UM  POLÍGON...Polígonos, Diagonais de um Polígono, SOMA DOS ANGULOS INTERNOS DE UM  POLÍGON...
Polígonos, Diagonais de um Polígono, SOMA DOS ANGULOS INTERNOS DE UM POLÍGON...
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
Introdução às Funções 9º ano: Diagrama de flexas, Valor numérico de uma funçã...
 
6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx6ano variação linguística ensino fundamental.pptx
6ano variação linguística ensino fundamental.pptx
 

Refatoração

  • 2. Refatoração • Refatoração (do inglês Refactoring) é o processo de modificar um sistema de software para melhorar a estrutura interna do código sem alterar seu comportamento externo. • O uso desta técnica evita a deterioração tão comum durante o ciclo de vida de um código. • Não se trata de otimização.
  • 3. Objetivo • Prevenir o envelhecimento do design e garantir a flexibilidade adequada para permitir a integração tranqüila de futuras extensões/alterações [Mens e Tourwé, 2004] – Em geral, uma refatoração é tão simples que parece que não vai ajudar muito. – Mas quando se juntam 50 refatorações, bem escolhidas, em seqüência, o código melhora radicalmente.
  • 4. Origem • 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 • Kent Beck (XP) na indústria
  • 5. Mau cheiro • O termo mau cheiro (bad smell) refere-se às estruturas no código que sugerem (às vezes gritam pela) possibilidade de refatoração [Fowler, 2000] • A partir da identificação de um mau cheiro é possível propor refatorações adequadas, que podem reduzir ou mesmo eliminar o mau cheiro
  • 6. Mau cheiro • Rigidez – uma alteração em um ponto do código requer alterações em cascata (dependências); • Fragilidade – A modificação de um ponto do código quebra outras funcionalidades; • Complexidade – Arquitetura muito complexa pois foi preparada para manipular qualquer tipo de possibilidade; • Duplicação – Código redundante, duplicado; • Legibilidade – Código difícil de compreender e entender
  • 7. Código Duplicado • Um dos problemas mais graves no código. Podem ser duas expressões idênticas em dois métodos na mesma classe, ou duas classes não associadas. – Essa duplicação pode ser eliminada aplicando-se a refatoração Extract Method. Nesse caso, o código é implementado uma única vez e chamado no local de origem onde estava o código duplicado. – Se o código duplicado encontra-se em duas classes distintas, pode-se aplicar a refatoração Extract Class.
  • 8. Método Longo • Consiste de um método com uma implementação de lógica com várias, dezenas ou até centenas de linhas de código. – O ideal seria criar métodos com no máximo dez linhas de código, podendo ser inclusive de uma a cinco. – Vários problemas podem ser originados da implementação de métodos longos. • A solução é dividir o método longo em métodos menores, usando-se a refatoração Extract Method.
  • 9. Classe larga • Uma boa prática da programação orientada a objetos sugere que uma classe deve ter uma única responsabilidade (princípio da responsabilidade única). • Quando uma classe possui muitas instâncias no código, isso sugere que ela está fazendo muito, ou pelo menos realizando trabalho que deveria ser feito por outras classes. • Algumas refatorações podem ajudar a reduzir classes longas, como por exemplo, Extrair Classe, Extract Subclass, entre outras.
  • 10. Lista de Parâmetros Longa • Um método que recebe muitos parâmetros sugere que classes possam estar compartilhando muita informação. • Se um método com uma longa lista de parâmetros está sendo chamado em vários locais do código, uma mudança em um deles pode desencadear uma cadeia muito grande de alterações em vários locais do código. • Algumas refatorações podem ajudar a resolver esse problema, por exemplo “Replace Parameter with Method” e “Introduce Parameter Object” onde uma longa lista de parâmetros se resume a uma única classe.
  • 11. Campo temporário • Muitas vezes um objeto tem sua variável de instância configurada somente sobre certas circunstâncias. Tal código é difícil de entender. Um exemplo ocorre quando um algoritmo depende de uma série de variáveis. • A refatoração “Extract Class” pode minimizar problemas associados á essas variáveis “pobres”
  • 12. Aspectos de qualidade • Simplicidade • Flexibilidade • Clareza • Desempenho
  • 13. Código limpo • Nomes significativos, que revelam sua intenção; • Expressa o que faz, por que existe, como é usado; • Nomes pronunciáveis; • Notação húngara, tipo não precisa estar no nome; • Nomes de classes são substantivos; • Nomes de métodos são verbos; • Assessores devem ter “get” e “set”
  • 14. Código limpo • Métodos pequenos (5 ou 10 linhas); • Linhas de até 100 caracteres; • Métodos devem realizar uma única tarefa; • Cuidar com lista longa de parâmetros; • Classes pequenas (200 linhas); • Seguir o princípio da responsabilidade única; • Cuidar o acoplamento entre classes (dependências); • Refatore ao invés de comentar;
  • 15. Extract Method (110) • Resumo – Você tem um fragmento de código que poderia ser agrupado. Mude o fragmento para um novo método e escolha um nome que explique o que ele faz.
  • 16. Extract Method (110) • Motivação – É uma das refatorações mais comuns. Se um método é longo demais ou difícil de entender e exige muitos comentários, extraia trechos do método e crie novos métodos para eles. Isso vai melhorar as chances de reutilização do código e vai fazer com que os métodos que o chamam fiquem mais fáceis de entender. O código fica parecendo comentário.
  • 17. Extract Method (110) • Mecânica: – Crie um novo método e escolha um nome que explicite a sua intenção (o nome deve dizer o que ele faz, não como ele faz). – Copie o código do método original para o novo. – Procure por variáveis locais e parâmetros utilizados pelo código extraído. • Se variáveis locais forem usadas apenas pelo código extraído, passe-as para o novo método. • Caso contrário, veja se o seu valor é apenas atualizado pelo código. Neste caso substitua o código por uma atribuição. • Se é tanto lido quando atualizado, passe-a como parâmetro. – Compile e teste.
  • 18. Inline Method (117) • Resumo: – A implementação de um método é tão clara quanto o nome do método. Substitua a chamada ao método pela sua implementação.
  • 19. Inline Method (117) • Motivação: – Bom para eliminar indireção desnecessária. Se você tem um grupo de métodos mal organizados, aplique Inline Method em todos eles seguido de uns bons Extract Methods
  • 20. Inline Method (117) • Mecânica: – Verifique se o método não é polimórfico ou se as suas subclasses o especializam. – Ache todas as chamadas e substitua pela implementação. – Compile e teste. – Remova a definição do método.
  • 21. Replace Temp with Query (120) • Resumo: – Uma variável local está sendo usada para guardar o resultado de uma expressão. Troque as referências a esta expressão por um método.
  • 22. Replace Temp with Query (120) • Motivação: – Variáveis temporárias encorajam métodos longos (devido ao escopo). O código fica mais limpo e o método pode ser usado em outros locais.
  • 23. Replace Temp with Query (120) • Mecânica: – Encontre variáveis locais que são atribuídas uma única vez • Se temp é atribuída mais do que uma vez use Split Temporary Variable (128) – Declare temp como final – Compile (para ter certeza) – Extraia a expressão • Método privado - efeitos colaterais – Compile e teste
  • 24. Replace Inheritance With Delegation (352) • Resumo: – Quando uma subclasse só usa parte da funcionalidade da superclasse ou não precisa herdar dados: na subclasse, crie um campo para a superclasse, ajuste os métodos apropriados para delegar para a ex-superclasse e remova a herança.
  • 25. Replace Inheritance With Delegation (352) • Motivação: – Herança é uma técnica excelente, mas muitas vezes, não é exatamente o que você quer. Às vezes, nós começamos herdando de uma outra classe mas daí descobrimos que precisamos herdar muito pouco da superclasse. Descobrimos que muitas das operações da superclasse não se aplicam à subclasse. Neste caso, delegação é mais apropriado.
  • 26. Replace Inheritance With Delegation (352) • Mecânica: – Crie um campo na subclasse que se refere a uma instância da superclasse, inicialize-o com this – Mude cada método na subclasse para que use o campo delegado – Compile e teste após mudar cada método • Cuidado com as chamadas a super – Remova a herança e crie um novo objeto da superclasse – Para cada método da superclasse utilizado, adicione um método delegado – Compile e teste
  • 27. Collapse Hierarchy (344) • Resumo: – A superclasse e a subclasse não são muito diferentes. Combine-as em apenas uma classe.
  • 28. Collapse Hierarchy (344) • Motivação: – Depois de muito trabalhar com uma hierarquia de classes, ela pode se tornar muito complexa. Depois de refatorá-la movendo métodos e campos para cima e para baixo, você pode descobrir que uma subclasse não acrescenta nada ao seu projeto. Remova-a.
  • 29. Collapse Hierarchy (344) • Mecânica: – Escolha que classe será eliminada: a superclasse ou a – subclasse – Use Pull Up Field (320) and Pull Up Method (322) ou Push Down Method (328) e Push Down Field (329) para mover todo o comportamento e dados da classe a ser eliminada – Compile e teste a cada movimento – Ajuste as referências à classe que será eliminada • Isto afeta: declarações, tipos de parâmetros e construtores. – Remova a classe vazia – Compile e teste
  • 30. Pull UP Field (320) • Resumo: – A superclasse e a subclasse têm os mesmos atributos (field). Mova os atributos repetidos para a superclasse.
  • 31. Pull UP Field (320) • Motivação: – Subclasses desenvolvidas independentemente umas das outras, ou após refatoração, podem ter características (features) duplicadas. Atributos podem ser duplicados. Estes não necessariamente têm o mesmo nome em todas as subclasses. A forma de determinar se tal acontece é verificar como os atributos são usados por outros métodos. Se eles são usados da mesma forma, pode-se generalizá-los.
  • 32. Pull UP Field (320) • Mecânica: – Inspecione todos os atributos candidatos para ver se não são usados de forma similar. – Se os atributos não têm o mesmo nome, dê-lhe o nome que vai ser usado quando ele “subir” para a superclasse. – Compile e teste. – Crie um novo atributo na superclasse. • Se o atributo era privado nas subclasses, deve-se colocá-lo como protegido na superclasse. – Apague o atributo nas subclasses. – Compile e teste.
  • 33. Extract Interface • Resumo: – Vários clientes usam o mesmo subconjunto da interface da classe, ou várias classes têm partes de suas interfaces em comum.
  • 34. Extract Interface • Motivação: – Classes usam umas às outras de várias formas. Pode- se ter, por exemplo, um grupo de clientes usando um subconjunto das responsabilidades da classe. E ainda, uma classe pode colaborar com qualquer classe que trate um certo grupo de requisições. Nestes casos, é útil transformar esse subconjunto de responsabilidades em algo com existência própria, para ficar claro e explícito seu uso no sistema. Dessa forma fica mais fácil de ver como as responsabilidades se dividem. E também, ao se inserir novas classes que implementem esse subconjunto, fica mais fácil de ver o que se encaixa nesse subconjunto.
  • 35. Extract Interface • Mecânica: – Crie uma interface vazia. – Declare as operações comuns na interface. – Declare as classes relevantes que devem implementar a interface. – Ajuste as declarações de tipos nos clientes para usar a interface. – Compile e teste.