SlideShare ist ein Scribd-Unternehmen logo
1 von 50
Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br




                 Code Smells
http://www.slideshare.net/rodrigobranas
@rodrigobranas
  rodrigo.branas@gmail.com
 http://www.agilecode.com.br
Formação Acadêmica
Ciências da Computação – UFSC
Gerenciamento de Projetos - FGV

Certificações

SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
Rodrigo Branas – rodrigo.branas@gmail.com
10 anos de experiência na plataforma Java
1000 horas em sala de aula
Mais de 50 palestras em eventos

Líder da área de desenvolvimento na Gennera
Autor da revista Java Magazine
Palestrante
Instrutor da Academia Java e Agile da Globalcode
Criador dos treinamentos de Clean Code, Selenium e
Maven da Agile Code

Trabalhou com as empresas: EDS, HP, GM, Citibank,
OnCast, Globalcode, V.Office, Dígitro, Softplan, Unimed,
Suntech, Vale do Rio Doce, Senai, NET.
Um smell é um sintoma que
ocorre dentro do código fonte e
 que pode ser um indicador de
          problemas.
Qual é a relação entre code
     smells e defeitos?
Aerodinâmica ou distância da
         margem
Técnicas de refactoring
        aplicáveis:

   Todas relacionadas a
simplificação de condicionais
        Extrair Método
Comentários no código
Autor do código acaba inserindo comentários
 para tentar compensar a complexidade ou
          nebulosidade do código
Técnicas de refactoring
      aplicáveis:

    Extrair Método
Se os comentários forem
    desnecessários:

Simplesmente apague-os.
1.    ...
2.    public void transmitirMensagem(String mensagem) {
3.      // Criando um envelope para enviar a mensagem
4.      Envelope envelope = new Envelope();
5.      // Definindo a mensagem no envelope
6.      envelope.setMensagem(mensagem);
7.      // Enviando o envelope
8.      this.sendEnvelope(envelope);
9.    }
10.   ...
1.    ...
2.    public void transmitirMensagem(String mensagem) {
3.
4.     Envelope envelope = new Envelope();
5.
6.     envelope.setMensagem(mensagem);
7.
8.     this.sendEnvelope(envelope);
9.    }
10.   ...
1.   ...
2.   public void transmitirMensagem(String mensagem) {
3.     Envelope envelope = new Envelope();
4.     envelope.setMensagem(mensagem);
5.     this.sendEnvelope(envelope);
6.   }
7.   ...
Método longo
Qual é o tamanho ideal?
Sempre deve ser o menor
        possível
Técnicas de refactoring
      aplicáveis:

    Extrair Método
Classes grandes
Por que as classes crescem
          tanto?
Coesão baixa
Se a sua classe possui muitos
 métodos longos, resolva um
   problema de cada vez.
Classes Utilitárias
Técnicas de refactoring
      aplicáveis:

    Extrair Classe
   Extrair Subclasse
    Mover Método
Longa lista de parâmetros
Qual é o número ideal de
parâmetros de um método?
Técnicas de refactoring
          aplicáveis:

Substituir Parâmetro por Método
    Preservar Objeto Inteiro
  Introduzir Objeto Parâmetro
Código Duplicado
Técnicas de refactoring
        aplicáveis:

      Extrair Método
       Extrair Classe
Subir Método na Hierarquia
Introduzir Template Method
Grupos de Dados
Existem alguns dados que
   andam sempre juntos,
         agrupados.

É comum observar esses dados
 andando juntos na forma de
        parâmetros.
1.   ...
2.   public Extrato emitirExtrato(Date inicio, Date fim);
3.   public double calcularJurosPeriodo(Date inicio, Date fim);
4.   public boolean verificarCredito(Date inicio, Date fim);
5.   ...
Técnicas de refactoring
        aplicáveis:

       Extrair Classe
Introduzir Objeto Parâmetro
 Preservar o Objeto Inteiro
Comandos Switch
Comandos switch tendem a ser
procedurais e a se repetirem em
  diversas partes do software.

 Ao se deparar com um comando
  switch você deve considerar a
introdução de um comportamento
        mais polimórfico.
Técnicas de refactoring
          aplicáveis:

  Substituir Enumeração pelo
   Padrão State ou Strategy
Substituir Comando Condicional
       por Polimorfismo
Generalidade Especulativa
“Eu acho que vamos precisar
      disso algum dia!”
Excesso de complexidade para
  tratar casos que ainda não
            existem.
Técnicas de refactoring
      aplicáveis:

Condensar Hierarquia
  Internalizar Classe
 Remover Parâmetro
  Renomear Método
Cadeias de Mensagens
Um cliente pede algo a um
objeto, que pede a outro objeto,
que pede a outro objeto e assim
           por diante.
1.   ...
2.   if (cliente.getCarteira().getCartao().verificarValidade()) {
3.     cliente.getCarteira().getCartao().comprar(valor);
4.   }
5.   ...
Lei de Demeter
Não fale com estranhos
Técnicas de refactoring
      aplicáveis:

  Ocultar Delegação

Weitere ähnliche Inhalte

Was ist angesagt?

Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverEduardo Jorge
 
Refinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoRefinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoAécio Costa
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Rodrigo Kono
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Javascript (parte 1)
Javascript (parte 1)Javascript (parte 1)
Javascript (parte 1)Alex Camargo
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehaveMarcelo Zeferino
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisRogerio Fontes
 
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Emerson Macedo
 
Demoiselle Behave - Visão Geral
Demoiselle Behave - Visão GeralDemoiselle Behave - Visão Geral
Demoiselle Behave - Visão GeralVanderson Silva
 
Introdução a programação I
Introdução a programação IIntrodução a programação I
Introdução a programação IClerton Leal
 

Was ist angesagt? (20)

Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
Clean code em C#
Clean code em C#Clean code em C#
Clean code em C#
 
Refinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoRefinamento e boas práticas de programação
Refinamento e boas práticas de programação
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)
 
Csharp
CsharpCsharp
Csharp
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Javascript (parte 1)
Javascript (parte 1)Javascript (parte 1)
Javascript (parte 1)
 
Clean Code
Clean CodeClean Code
Clean Code
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehave
 
Refatoração
RefatoraçãoRefatoração
Refatoração
 
Behaviour-Driven Development com Ruby
Behaviour-Driven Development com RubyBehaviour-Driven Development com Ruby
Behaviour-Driven Development com Ruby
 
Aula2
Aula2Aula2
Aula2
 
Introdução ao C#
Introdução ao C#Introdução ao C#
Introdução ao C#
 
Clean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everisClean code @rogeriofontes-techfriday-everis
Clean code @rogeriofontes-techfriday-everis
 
Filtro de SPAM
Filtro de SPAMFiltro de SPAM
Filtro de SPAM
 
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
 
Demoiselle Behave - Visão Geral
Demoiselle Behave - Visão GeralDemoiselle Behave - Visão Geral
Demoiselle Behave - Visão Geral
 
Test-driven Development
Test-driven DevelopmentTest-driven Development
Test-driven Development
 
Introdução a programação I
Introdução a programação IIntrodução a programação I
Introdução a programação I
 

Ähnlich wie Code Smells

Apresentacao tdc 2012
Apresentacao tdc 2012Apresentacao tdc 2012
Apresentacao tdc 2012Jorge Oleques
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshopguestd37c23
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018Renato Groff
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Thyago Maia
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesedgarddavidson.com
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3klaussilveira
 
Tdc2015 bigdata-mpias-final-pdf
Tdc2015 bigdata-mpias-final-pdfTdc2015 bigdata-mpias-final-pdf
Tdc2015 bigdata-mpias-final-pdfMinistry of Data
 
TDC2018SP | Trilha .Net - Programacao Funcional com C#
TDC2018SP | Trilha .Net - Programacao Funcional com C#TDC2018SP | Trilha .Net - Programacao Funcional com C#
TDC2018SP | Trilha .Net - Programacao Funcional com C#tdc-globalcode
 
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ódigoJuciellen Cabrera
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...Renato Groff
 
Pattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptPattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptGustavo Corrêa Alves
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Hertz - Janeiro-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Hertz - Janeiro-2018Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Hertz - Janeiro-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Hertz - Janeiro-2018Renato Groff
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...Renato Groffe
 
Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Thyago Maia
 
Testes de aceitação automatizados com robotium utilizando a técnica bdd TDC...
Testes de aceitação automatizados com robotium utilizando a técnica bdd   TDC...Testes de aceitação automatizados com robotium utilizando a técnica bdd   TDC...
Testes de aceitação automatizados com robotium utilizando a técnica bdd TDC...Rafael Chiavegatto
 

Ähnlich wie Code Smells (20)

Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Apresentacao tdc 2012
Apresentacao tdc 2012Apresentacao tdc 2012
Apresentacao tdc 2012
 
Refactoring
RefactoringRefactoring
Refactoring
 
Refactory Worshop
Refactory WorshopRefactory Worshop
Refactory Worshop
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrões
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3
 
Tdc2015 bigdata-mpias-final-pdf
Tdc2015 bigdata-mpias-final-pdfTdc2015 bigdata-mpias-final-pdf
Tdc2015 bigdata-mpias-final-pdf
 
Refatoração
RefatoraçãoRefatoração
Refatoração
 
TDC2018SP | Trilha .Net - Programacao Funcional com C#
TDC2018SP | Trilha .Net - Programacao Funcional com C#TDC2018SP | Trilha .Net - Programacao Funcional com C#
TDC2018SP | Trilha .Net - Programacao Funcional com C#
 
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
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Grupo Bandeirantes - ...
 
Pattners Everywhere, Even in Javascript
Pattners Everywhere, Even in JavascriptPattners Everywhere, Even in Javascript
Pattners Everywhere, Even in Javascript
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Hertz - Janeiro-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Hertz - Janeiro-2018Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Hertz - Janeiro-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Hertz - Janeiro-2018
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - Developers-SP - Janei...
 
PHPZEIRO: Adote um framework
PHPZEIRO: Adote um frameworkPHPZEIRO: Adote um framework
PHPZEIRO: Adote um framework
 
Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1
 
Testes de aceitação automatizados com robotium utilizando a técnica bdd TDC...
Testes de aceitação automatizados com robotium utilizando a técnica bdd   TDC...Testes de aceitação automatizados com robotium utilizando a técnica bdd   TDC...
Testes de aceitação automatizados com robotium utilizando a técnica bdd TDC...
 

Mehr von Rodrigo Branas

Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 
Node.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasRodrigo Branas
 
Node.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasRodrigo Branas
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasRodrigo Branas
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasRodrigo Branas
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasRodrigo Branas
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasRodrigo Branas
 
#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisasRodrigo Branas
 
#1 - Git - Introdução
#1 - Git - Introdução#1 - Git - Introdução
#1 - Git - IntroduçãoRodrigo Branas
 
#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remotoRodrigo Branas
 
#3 - Git - Branching e Merging
#3 - Git - Branching e Merging#3 - Git - Branching e Merging
#3 - Git - Branching e MergingRodrigo Branas
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJSRodrigo Branas
 
JavaScript - Expressões Regulares
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões RegularesRodrigo Branas
 
Automação de Testes com AngularJS
Automação de Testes com AngularJSAutomação de Testes com AngularJS
Automação de Testes com AngularJSRodrigo Branas
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSRodrigo Branas
 

Mehr von Rodrigo Branas (20)

Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 
Node.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo Branas
 
Node.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo Branas
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo Branas
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
 
#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas
 
#1 - Git - Introdução
#1 - Git - Introdução#1 - Git - Introdução
#1 - Git - Introdução
 
#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto
 
#4 - Git - Stash
#4 - Git - Stash#4 - Git - Stash
#4 - Git - Stash
 
#3 - Git - Branching e Merging
#3 - Git - Branching e Merging#3 - Git - Branching e Merging
#3 - Git - Branching e Merging
 
#2 - Git - DAG
#2 - Git - DAG#2 - Git - DAG
#2 - Git - DAG
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJS
 
JavaScript - Date
JavaScript - DateJavaScript - Date
JavaScript - Date
 
JavaScript - Expressões Regulares
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões Regulares
 
Automação de Testes com AngularJS
Automação de Testes com AngularJSAutomação de Testes com AngularJS
Automação de Testes com AngularJS
 
Scope AngularJS
Scope AngularJSScope AngularJS
Scope AngularJS
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJS
 

Code Smells

  • 1. Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br Code Smells
  • 3. @rodrigobranas rodrigo.branas@gmail.com http://www.agilecode.com.br Formação Acadêmica Ciências da Computação – UFSC Gerenciamento de Projetos - FGV Certificações SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
  • 4. Rodrigo Branas – rodrigo.branas@gmail.com 10 anos de experiência na plataforma Java 1000 horas em sala de aula Mais de 50 palestras em eventos Líder da área de desenvolvimento na Gennera Autor da revista Java Magazine Palestrante Instrutor da Academia Java e Agile da Globalcode Criador dos treinamentos de Clean Code, Selenium e Maven da Agile Code Trabalhou com as empresas: EDS, HP, GM, Citibank, OnCast, Globalcode, V.Office, Dígitro, Softplan, Unimed, Suntech, Vale do Rio Doce, Senai, NET.
  • 5. Um smell é um sintoma que ocorre dentro do código fonte e que pode ser um indicador de problemas.
  • 6. Qual é a relação entre code smells e defeitos?
  • 8.
  • 9. Técnicas de refactoring aplicáveis: Todas relacionadas a simplificação de condicionais Extrair Método
  • 11. Autor do código acaba inserindo comentários para tentar compensar a complexidade ou nebulosidade do código
  • 12. Técnicas de refactoring aplicáveis: Extrair Método
  • 13. Se os comentários forem desnecessários: Simplesmente apague-os.
  • 14. 1. ... 2. public void transmitirMensagem(String mensagem) { 3. // Criando um envelope para enviar a mensagem 4. Envelope envelope = new Envelope(); 5. // Definindo a mensagem no envelope 6. envelope.setMensagem(mensagem); 7. // Enviando o envelope 8. this.sendEnvelope(envelope); 9. } 10. ...
  • 15. 1. ... 2. public void transmitirMensagem(String mensagem) { 3. 4. Envelope envelope = new Envelope(); 5. 6. envelope.setMensagem(mensagem); 7. 8. this.sendEnvelope(envelope); 9. } 10. ...
  • 16. 1. ... 2. public void transmitirMensagem(String mensagem) { 3. Envelope envelope = new Envelope(); 4. envelope.setMensagem(mensagem); 5. this.sendEnvelope(envelope); 6. } 7. ...
  • 18. Qual é o tamanho ideal?
  • 19. Sempre deve ser o menor possível
  • 20.
  • 21. Técnicas de refactoring aplicáveis: Extrair Método
  • 23. Por que as classes crescem tanto?
  • 25. Se a sua classe possui muitos métodos longos, resolva um problema de cada vez.
  • 27. Técnicas de refactoring aplicáveis: Extrair Classe Extrair Subclasse Mover Método
  • 28. Longa lista de parâmetros
  • 29. Qual é o número ideal de parâmetros de um método?
  • 30. Técnicas de refactoring aplicáveis: Substituir Parâmetro por Método Preservar Objeto Inteiro Introduzir Objeto Parâmetro
  • 32.
  • 33. Técnicas de refactoring aplicáveis: Extrair Método Extrair Classe Subir Método na Hierarquia Introduzir Template Method
  • 35. Existem alguns dados que andam sempre juntos, agrupados. É comum observar esses dados andando juntos na forma de parâmetros.
  • 36. 1. ... 2. public Extrato emitirExtrato(Date inicio, Date fim); 3. public double calcularJurosPeriodo(Date inicio, Date fim); 4. public boolean verificarCredito(Date inicio, Date fim); 5. ...
  • 37. Técnicas de refactoring aplicáveis: Extrair Classe Introduzir Objeto Parâmetro Preservar o Objeto Inteiro
  • 39. Comandos switch tendem a ser procedurais e a se repetirem em diversas partes do software. Ao se deparar com um comando switch você deve considerar a introdução de um comportamento mais polimórfico.
  • 40. Técnicas de refactoring aplicáveis: Substituir Enumeração pelo Padrão State ou Strategy Substituir Comando Condicional por Polimorfismo
  • 42. “Eu acho que vamos precisar disso algum dia!”
  • 43. Excesso de complexidade para tratar casos que ainda não existem.
  • 44. Técnicas de refactoring aplicáveis: Condensar Hierarquia Internalizar Classe Remover Parâmetro Renomear Método
  • 46. Um cliente pede algo a um objeto, que pede a outro objeto, que pede a outro objeto e assim por diante.
  • 47. 1. ... 2. if (cliente.getCarteira().getCartao().verificarValidade()) { 3. cliente.getCarteira().getCartao().comprar(valor); 4. } 5. ...
  • 49. Não fale com estranhos
  • 50. Técnicas de refactoring aplicáveis: Ocultar Delegação