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

Code Smells

  • 1.
    Rodrigo Branas –@rodrigobranas - http://www.agilecode.com.br Code Smells
  • 2.
  • 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 é arelação entre code smells e defeitos?
  • 7.
  • 9.
    Técnicas de refactoring aplicáveis: Todas relacionadas a simplificação de condicionais Extrair Método
  • 10.
  • 11.
    Autor do códigoacaba 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áriosforem 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. ...
  • 17.
  • 18.
    Qual é otamanho ideal?
  • 19.
    Sempre deve sero menor possível
  • 21.
    Técnicas de refactoring aplicáveis: Extrair Método
  • 22.
  • 23.
    Por que asclasses crescem tanto?
  • 24.
  • 25.
    Se a suaclasse possui muitos métodos longos, resolva um problema de cada vez.
  • 26.
  • 27.
    Técnicas de refactoring aplicáveis: Extrair Classe Extrair Subclasse Mover Método
  • 28.
    Longa lista deparâmetros
  • 29.
    Qual é onú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
  • 31.
  • 33.
    Técnicas de refactoring aplicáveis: Extrair Método Extrair Classe Subir Método na Hierarquia Introduzir Template Method
  • 34.
  • 35.
    Existem alguns dadosque 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
  • 38.
  • 39.
    Comandos switch tendema 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
  • 41.
  • 42.
    “Eu acho quevamos precisar disso algum dia!”
  • 43.
    Excesso de complexidadepara tratar casos que ainda não existem.
  • 44.
    Técnicas de refactoring aplicáveis: Condensar Hierarquia Internalizar Classe Remover Parâmetro Renomear Método
  • 45.
  • 46.
    Um cliente pedealgo 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. ...
  • 48.
  • 49.
    Não fale comestranhos
  • 50.
    Técnicas de refactoring aplicáveis: Ocultar Delegação