Bad Smells

Felipe Ghiggi, Michele Flores, Ricardo Machado

Técnicas Avançadas de Programação

Gabriel Simões

Bloaters
 

Dispensables


Object-Orientation Abusers

Bloaters

Long Method

Sintomas:

Muitas linhas de código: 10+

Perda da lógica

Bloaters

Long Method

Razões do problema:

"Se tá ali é importante, não vou tirar"

"Muita mão"

"São só mais duas linhas"

"Não vou criar um método novo"

Bloaters

Long Method

Solução:

Se precisa comentar o método, coloque em um novo
Tenha um nome descritivo
Use ferramentas de refarotação disponibilizadas pela IDE

Bloaters

Long Method

Benefícios:

Durabilidade
Evita duplicação
Não prejudica o desempenho
Código claro e eficaz

public class ValidaCPF {

    /**
     * @param args the command line arguments
     */
    public static void mainn(String[] args) {
        // TODO code application logic here
        String cpf = "281175491";
        Integer vA;
        Integer vB;
        String verificador;
        Integer multiplicador = cpf.length() + 1;
        Integer soma = 0;
        for(Character c:cpf.toCharArray()){
            soma += Integer.parseInt(c.toString()) * multiplicador;
            multiplicador--;
        }
        
        if(soma % 11 < 2){
            vA = 0;
        }else{
            vA = 11 - (soma % 11);
        }
        
        soma = 0;
        cpf += vA;
        multiplicador = cpf.length() + 1;
        for(Character c:cpf.toCharArray()){
            soma += Integer.parseInt(c.toString()) * multiplicador;
            multiplicador--;
        }
        
        cpf = cpf.substring(0, 9);
        
        if(soma % 11 < 2){
            vB = 0;
        }else{
            vB = 11 - (soma % 11);
        }
        
        verificador = vA + "" + vB;
        
        System.out.print(cpf);
        System.out.print("-");
        System.out.println(verificador);
    }
    
}
public class ValidadorCPF {
    
    public static boolean validaCPF(String cpf){
        String verificadorGerado = geraVerificador(cpf.substring(0, 9));
        String verificadorAtual = getVerificador(cpf);
        return verificadorAtual.equals(verificadorGerado);
    }
    
    private static String geraVerificador(String cpf){
        String verificador = geraMetadeVerificador(cpf);
        verificador += geraMetadeVerificador(cpf + verificador);
        return verificador;
    }
    
    private static String geraMetadeVerificador(String cpf){
        Integer soma = somaDigitos(cpf);
        String verificador = resolveVerificador(soma);
        return verificador;
    }
    
    private static String getVerificador(String cpf){
        return cpf.substring(9, 11);
    }
    
    private static Integer somaDigitos(String cpf){
        Integer soma = 0;
        Integer multiplicador = cpf.length() + 1;
        for(Character c:cpf.toCharArray()){
            soma += Integer.parseInt(c.toString()) * multiplicador;
            multiplicador--;
        }
        return soma;
    }
    
    private static String resolveVerificador(Integer soma){
        Integer verificador;
        
        if(soma % 11 < 2){
            verificador = 0;
        }else{
            verificador = 11 - (soma % 11);
        }
        
        return String.valueOf(verificador);
    }
    
}

Dispensables

Comments


// aqui vão os comentários de explicação do código

-- Código com muitos comentários
/*
Explicando o que
muitos comentários
podem causar
na leitura
de um código
de alguma
aplicação
*/
 //** Comentário
 * comentário
 * comentário
 * ...
 */

Dispensables

Comments

Solução:

Se explica uma expressão complexa, divida em subexpressões [Extract Variable]

Se explica uma seção de código, transforme em um método separado [Extract Method]

Se este método ainda precisar de comentário, nomeie ele melhor [Rename Method]

Dispensables

Comments

Benefícios e Utilidades:

Código óbvio e intuitivo

Explicar por que algo está sendo implementado de uma forma particular

Explicar algoritmos complexos






/// Método que retorna quando this.closed é verdade. Lança uma exceção
// Se o tempo limite é atingido.

public synchronized void waitForClose(final long timeoutMillis) throws Exception
{
    if(!closed)
    {
        wait(timeoutMillis);
        if(!closed)
        throw new Exception("MockResponseSender could not be closed");
    }
}




public synchronized void waitForClose(final long timeoutMillis) throws Exception
{
    if(!closed)
    {
        wait(timeoutMillis);
        if(!closed)
        throw new Exception("MockResponseSender could not be closed");
    }
}

Object-Orientation Abusers

Refused Bequest

Sintomas:

Subclasse utiliza apenas alguns dos métodos e propriedades
herdadas de seus pais = a hierarquia é fora de ordem

Object-Orientation Abusers

Refused Bequest

Razão do problema:

Criar herança entre as classes apenas pelo desejo de reutilizar o código em uma superclasse, mas a superclasse e subclasse são completamente diferentes.

Object-Orientation Abusers

Refused Bequest

Solução:

Se a herança não faz sentido e a subclasse tem nada em comum com os superclasse, elimine a herança [Replace Inheritance with Delegation]
 

Se a herança é apropriada, se livrar de campos e métodos na subclasse desnecessários. Extraia todos os campos e métodos necessários para a subclasse da classe pai, coloque-os em uma nova subclasse e defina ambas as classes para herdar a partir dele [Extract Superclass]

Object-Orientation Abusers

Refused Bequest

Benefícios:

Melhora a clareza de código e organização.

Você já não tem que se perguntar por que a uma classe é herdada de outra classe.



public class PessoaFisica {
private String nome;

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

...
}

public class Empresa extends PessoaFisica{
private String cnpj;

...
}






public class PessoaFisica {
private String nome;
...
}

public class Empresa{
private String nome;
private String cnpj;
...
}

Extract Method

OBRIGADA! ♥

Bad Smells

By Michele Correia Flores

Bad Smells

This work is about Bad Smells in a code. What is and how avoid this. Bibliography: https://sourcemaking.com/refactoring/smells

  • 332