Felipe Ghiggi, Michele Flores, Ricardo Machado
Técnicas Avançadas de Programação
Gabriel Simões
Sintomas:
Muitas linhas de código: 10+
Perda da lógica
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"
Solução:
Se precisa comentar o método, coloque em um novo
Tenha um nome descritivo
Use ferramentas de refarotação disponibilizadas pela IDE
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);
}
}
// 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
* ...
*/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]
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");
}
}Sintomas:
Subclasse utiliza apenas alguns dos métodos e propriedades
herdadas de seus pais = a hierarquia é fora de ordem
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.
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]
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