SlideShare uma empresa Scribd logo
Refatoração com
Capitão Nascimento
    Eduardo Bregaida
Eduardo Bregaida
•   http://javawora.blogspot.com


•   @bregaida


•   eduardo.bregaida@gmail.com
O Conceito de
    Refatoração
Por Martin Fowler...
É o processo de
reescrever um programa
   de computador para
melhorar sua estrutura ou
legibilidade, preservando
         assim seu
   comportamento.
Teve sua origem nos anos
  80/90 com Smalltalk...
Desenvolveu-
   se formalmente na
Universidade de Illinois em
   Urbana-Champaign.
 Grupo do Prof. Ralph
       Johnson...
Capitão?
Pois não?
Seu 05 está dormindo
Seu 05
Senhor?
Tenha a bondade
 de segurar isto.
Seu 05 se o senhor dormir
o senhor vai se explodir, vai
me explodir...
E vai explodir a todos seus
  companheiros do FISL.
O senhor vai dormir seu 05?
Não Senhor!
Estamos todos confiando no
          senhor.
Vamos analisar a motivação
       de refatorar
Por que refatorar?
Mudará algo na geração dos
        bytecodes?
Mudará algo para o
  computador?
Mudará algo para o cliente?
Não!
Facilitará para o senhor
     no caso de uma
  manutenção lembrar
 facilmente do código
Facilitará para outros
desenvolvedores entender o
    que o código faz
Manutenibilidade
Um exemplo de código
      senhores
Dado um array de N elementos, calcular a seguinte operações:
Dado um array de N elementos, calcular a seguinte operações:


   * Primeiro item menos o último
Dado um array de N elementos, calcular a seguinte operações:


   * Primeiro item menos o último
   * O resultado dessa subtração elevado ao quadrado
   somado ao segundo item menos o penúltimo
Dado um array de N elementos, calcular a seguinte operações:


   * Primeiro item menos o último
   * O resultado dessa subtração elevado ao quadrado
   somado ao segundo item menos o penúltimo

   * O resultado dessa subtração elevado ao
   quadrado.
Dado um array de N elementos, calcular a seguinte operações:


   * Primeiro item menos o último
   * O resultado dessa subtração elevado ao quadrado
   somado ao segundo item menos o penúltimo

   * O resultado dessa subtração elevado ao
   quadrado.
   * uma seqüência com N elementos
Dado um array de N elementos, calcular a seguinte operações:


   * Primeiro item menos o último
   * O resultado dessa subtração elevado ao quadrado
   somado ao segundo item menos o penúltimo

   * O resultado dessa subtração elevado ao
   quadrado.
   * uma seqüência com N elementos

   * (1o - N) ^2 + (2o - (N-1)) ^2 + ... + (N/2 - N/2)^2
Dado um array de N elementos, calcular a seguinte operações:


   * Primeiro item menos o último
   * O resultado dessa subtração elevado ao quadrado
   somado ao segundo item menos o penúltimo

   * O resultado dessa subtração elevado ao
   quadrado.
   * uma seqüência com N elementos

   * (1o - N) ^2 + (2o - (N-1)) ^2 + ... + (N/2 - N/2)^2
   * Retornar essa soma ou "-1" caso a entrada seja
   inválida
public class Calcula
{
	   // contador do array
     static int count=-1;

       // método que faz o calculo solicitado
       public int somaSerie (int array [])
       {
           if(null == array)
               return -1;
           else if(++count>=array.length/2) // se chegou na metade, retorna
zero
               return 0;

           // aplica a fórmula com chamada recursiva
           return ((array[count]-array[array.length-(count+1)])*
                   (array[count]-array[array.length-(count+1)])) + somaSerie
(array);
    }

// Teste aqui?
    public static void main(String args[])
    {
        int ar[] = {1,2,3,4,5,6,7,8,9,10,11};
        System.out.println("Resultado=" + new Calcula().somaSerie(ar));
    }
}
Fácil de entender senhores?
Não...
Vamos ver como a
refatoração o melhora
public class CalculaRef {
	   //Constante do valor Metade
	   private static final int VALOR_METADE = 2;
	
	   // contador do array
	   static int count = -1;
	   private int[] array;
	   private int tamanho = 0;

	   // retorno para array nulo
	   final int ENTRADA_INVALIDA = -1;

	   public CalculaRef(int[] array) {
	   	    this.array = array;
	   	    tamanho = array.length;
	   }

	   // mesmo cálculo efetuado na classe Calcula
	   // mas as operações difíceis de ler
	   // foram transformadas em métodos
	   public int somaSerie() {
	   	    if (array.length == 0)
	   	    	    return ENTRADA_INVALIDA;
	   	    else if (isMaiorQueMetade(++count))
	   	    	    return 0;

	   	   int subtracaoValores = getPrimeiroItemArrayMenosUltimo();
	   	   return (getPotenciaQuadrado(subtracaoValores) + somaSerie());
	   }

	   public int getPotenciaQuadrado(int numeroOperacao) {
	   	    return numeroOperacao * numeroOperacao;
	   }

	   public int getPrimeiroItemArrayMenosUltimo() {
	   	    return array[count] - array[tamanho - (count + 1)];
	   }

	   public boolean isMaiorQueMetade(int indice) {
	   	    return indice >= tamanho / VALOR_METADE;
	   }

}
/**
  * Classe de Teste
  */
public class CalculaRefTeste {
	
	 public static void main(String args[]) {
	 	 int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
	 	 CalculaRef refTeste = new CalculaRef(ar);
	 	 System.out.println("Resultado=" + refTeste.somaSerie());
	 }
}
Podemos melhorar mais...
public class CalculaRefDois {

	   // contador deixou de ser estático e passou a ser um atributo
	   private int count = -1;

	   // array possui agora uma classe para efetuar suas operações específicas
	   private ArrayUtil arrayUtil;
	   final int ENTRADA_INVALIDA = -1;

	   public CalculaRefDois(int[] array) {
	   	   // inicializa classe do array
	   	   this.arrayUtil = new ArrayUtil(array);
	   }

	   // ficou quase igual ao método da classe CalculaRefHum a diferença
     // é que o IF e o ELSE IF chamam métodos da classe nova a ArrayUtils
	   public int somaSerie() {
	   	   if (arrayUtil.getTamanho() == 0)
	   	   	    return ENTRADA_INVALIDA;
	   	   else if (arrayUtil.isMaiorQueMetade(++count))
	   	   	    return 0;

	   	   int subtracaoValores = getPrimeiroItemArrayMenosUltimo();
	   	   return (getPotenciaQuadrado(subtracaoValores) + somaSerie());
	   }

	   public int getPotenciaQuadrado(int valorSubtracao) {
	   	   // Utilizando a lib Math do Java na qual já cálcula um valor passado e seu expoente
	   	   //Cast de int pois pow retorna double
	   	   return (int) Math.pow(valorSubtracao,EXPOENTE_QUADRADO);
	   }

	   public int getPrimeiroItemArrayMenosUltimo() {
	   	   return arrayUtil.getItem(count) - arrayUtil.getItemIndiceInverso(count);
	   }
}
public class ArrayUtil {

    	   private int array[];
    	   private int tamanho = 0;
	       private static final int VALOR_HUM = 1;
	       //Constante do valor Metade
	       private static final int VALOR_METADE = 2;

    	   public ArrayUtil(int array[]) {
    	   	   this.array = array;
    	   	   if (null == array)
    	   	   	   this.array = new int[] {};
    	   	   tamanho = this.array.length;
    	   }

    	   public int getIndiceIntermediario() {
    	   	   return tamanho / VALOR_METADE;
    	   }

    	   public int getTamanho() {
    	   	   return tamanho;
    	   }

    	   public int getItem(int indice) {
    	   	   return array[indice];
    	   }

    	   public int getItemIndiceInverso(int indice) {
    	   	   return array[tamanho - (indice + VALOR_HUM)];
    	   }

    	   public boolean isMaiorQueMetade(int indice) {
    	   	   return indice >= getIndiceIntermediario();
    	   }
    }
Senhor, o que é preciso para
         refatorar?
Xerife, o senhor precisa
     testar o código
Xerife, o senhor precisa
sentir o “mau cheiro” do
         código!
O que seria sentir o “mau
cheiro” do código senhor?
Classes com muitas
 responsabilidades
Um código sem padrão
        algum
Sistemas sem alta
  coesão e baixo
   acoplamento
Ah, mas isso dá muito
    trabalho senhor
Xerife
O senhor é um fanfarrão
      seu Xerife
Os senhores têm
que refatorar sempre
public class PontoHandler {
	    private Ponto ponto = new Ponto();
	    private Session session;
     private DAO<Ponto> dao;
	    	
	    public void salvar() {
	    	    session = HibernateUtil.getCurrentSession();
	    	    dao = new DAO<Ponto>(session, Ponto.class);
	    	    if (ponto.getId() == 0) {
	    	    	     dao.salveOrUpdate(this.ponto);
	    	    } else {
	    	    	     session.merge(this.ponto);
	    	    }
	    	    this.ponto = new Ponto();

	    }

	    public void carregar(ActionEvent event) {
	    	    UIComponent comandLink = event.getComponent();
	    	    UIParameter parameter = (UIParameter) comandLink
	    	    	    	     .findComponent("editId");
	    	    Long id = (Long) parameter.getValue();
	    	    session = HibernateUtil.getCurrentSession();
	    	    dao = new DAO<Ponto>(session, Ponto.class);
	    	    this.ponto = dao.load(id);

	    }

	    public void excluir(ActionEvent event) {
	    	    UIComponent comandLink = event.getComponent();
	    	    UIParameter parameter = (UIParameter) comandLink
	    	    	    	     .findComponent("editId");
	    	    Long id = (Long) parameter.getValue();
	    	    session = HibernateUtil.getCurrentSession();
	    	    DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class);
	    	    this.ponto = dao.load(id);
	    	    dao.deleta(ponto);
	    	    this.ponto = new Ponto();

	    }

//Outros métodos

}
Eliminem a duplicidade
Dêem nomes decentes
   aos métodos e os
     parâmetros
public class PontoHandler {
	   private Ponto ponto = new Ponto();
	   private PontoBusiness negocio = new PontoBusiness();	
	   private Long id ;
	
	   public void salvar() {
	   	    if (ponto.getId() == 0) {
	   	    	    negocio.salvar(this.ponto);
	   	    } else {
	   	    	    negocio.merge(this.ponto);
	   	    }
	   	    this.ponto = new Ponto();

	   }

	   public void carregar(ActionEvent event) {
	   	    id = populaDados(event);
	   	    this.ponto = negocio.carregar(id);
	   }

	   public void excluir(ActionEvent event) {
	   	    id = populaDados(event);
	   	    this.ponto = negocio.carregar(id);
	   	    negocio.excluir(ponto);
	   	    this.ponto = new Ponto();
	   }
	
	   public List<Ponto> getAllPonto() {
	   	    return negocio.getAllPontos();
	   }

	   /**
	    * Popula os dados dos componentes JSF
	    * @param event
	    * @return id
	    */
	   private Long populaDados(ActionEvent event)
	   {
	   	    UIComponent comandLink = event.getComponent();
	   	    UIParameter parameter = (UIParameter) comandLink.findComponent("editId");
	   	    Long id = (Long) parameter.getValue();
	   	    return id;
	   }

    //Outros métodos
}
Os nomes dos
 métodos e parâmetros
tem que ser condizentes
 com o que eles fazem
public class PontoHandler {

	   private Ponto ponto = new Ponto();

	   private Session session;

    private DAO<Ponto> dao;
	   	
	   public void salvar() {
	     //Implementação
	   }



	   public void carregar(ActionEvent event) {
	     //Implementação
	   }



	   public void excluir(ActionEvent event) {
	     //Implementação
	   }



}
Os métodos e classes
 devem ser pequenos
public class PontoHandler {
	    private Ponto ponto = new Ponto();
	    private Session session;
     private DAO<Ponto> dao;
	    	
	    public void salvar() {
	    	    session = HibernateUtil.getCurrentSession();
	    	    dao = new DAO<Ponto>(session, Ponto.class);
	    	    if (ponto.getId() == 0) {
	    	    	     dao.salveOrUpdate(this.ponto);
	    	    } else {
	    	    	     session.merge(this.ponto);
	    	    }
	    	    this.ponto = new Ponto();

	    }

	    public void carregar(ActionEvent event) {
	    	    UIComponent comandLink = event.getComponent();
	    	    UIParameter parameter = (UIParameter) comandLink
	    	    	    	     .findComponent("editId");
	    	    Long id = (Long) parameter.getValue();
	    	    session = HibernateUtil.getCurrentSession();
	    	    dao = new DAO<Ponto>(session, Ponto.class);
	    	    this.ponto = dao.load(id);

	    }

	    public void excluir(ActionEvent event) {
	    	    UIComponent comandLink = event.getComponent();
	    	    UIParameter parameter = (UIParameter) comandLink
	    	    	    	     .findComponent("editId");
	    	    Long id = (Long) parameter.getValue();
	    	    session = HibernateUtil.getCurrentSession();
	    	    DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class);
	    	    this.ponto = dao.load(id);
	    	    dao.deleta(ponto);
	    	    this.ponto = new Ponto();

	    }

//Outros métodos

}
public class PontoHandler {
	   private Ponto ponto = new Ponto();
	   private PontoBusiness negocio = new PontoBusiness();	
	   private Long id ;
	
	   public void salvar() {
	   	   if (ponto.getId() == 0) {
	   	   	    negocio.salvar(this.ponto);
	   	   } else {
	   	   	    negocio.merge(this.ponto);
	   	   }
	   	   this.ponto = new Ponto();

	   }

	   public void carregar(ActionEvent event) {
	   	   id = populaDados(event);
	   	   this.ponto = negocio.carregar(id);
	   }

	   public void excluir(ActionEvent event) {
	   	   id = populaDados(event);
	   	   this.ponto = negocio.carregar(id);
	   	   negocio.excluir(ponto);
	   	   this.ponto = new Ponto();
	   }
	
	   /**
	    * Popula os dados dos componentes JSF
	    * @param event
	    * @return id
	    */
	   private Long populaDados(ActionEvent event)
	   {
	   	   UIComponent comandLink = event.getComponent();
	   	   UIParameter parameter = (UIParameter) comandLink.findComponent("editId");
	   	   Long id = (Long) parameter.getValue();
	   	   return id;
	   }

    //Outros métodos
}
Crie
comentários no
   código
Utilize o JavaDoc
/**
  * @author eduardobregaida
  * PontoHandler
  * ManagedBean para fazer a ponte entre a View e o Controller
  */
public class PontoHandler {
	
	    // Classe de Ponto do ônibus
	    private Ponto ponto = new Ponto();

	   // Classe da Linha do ônibus
	   private Linha linha = new Linha();
	
	   // Método para Salvar um Ponto
	   public void salvar() {
	   	   if (ponto.getId() == 0) {
	   	   	   negocio.salvar(this.ponto);
	   	   } else {
	   	   	   negocio.merge(this.ponto);
	   	   }
	   	   this.ponto = new Ponto();

	   }

// Método para excluir um ponto recebe um evento do componente
	   	
	   public void excluir(ActionEvent event) {
	   	   id = populaDados(event);
	   	   this.ponto = negocio.carregar(id);
	   	   negocio.excluir(ponto);
	   	   this.ponto = new Ponto();
	   }

}
Tire as responsabilidades
     a mais nas classes
public class PontoHandler {
	    private Ponto ponto = new Ponto();
	    private Session session;
     private DAO<Ponto> dao;
	    	
	    public void salvar() {
	    	    session = HibernateUtil.getCurrentSession();
	    	    dao = new DAO<Ponto>(session, Ponto.class);
	    	    if (ponto.getId() == 0) {
	    	    	     dao.salveOrUpdate(this.ponto);
	    	    } else {
	    	    	     session.merge(this.ponto);
	    	    }
	    	    this.ponto = new Ponto();

	    }

	    public void carregar(ActionEvent event) {
	    	    UIComponent comandLink = event.getComponent();
	    	    UIParameter parameter = (UIParameter) comandLink
	    	    	    	     .findComponent("editId");
	    	    Long id = (Long) parameter.getValue();
	    	    session = HibernateUtil.getCurrentSession();
	    	    dao = new DAO<Ponto>(session, Ponto.class);
	    	    this.ponto = dao.load(id);

	    }

	    public void excluir(ActionEvent event) {
	    	    UIComponent comandLink = event.getComponent();
	    	    UIParameter parameter = (UIParameter) comandLink
	    	    	    	     .findComponent("editId");
	    	    Long id = (Long) parameter.getValue();
	    	    session = HibernateUtil.getCurrentSession();
	    	    DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class);
	    	    this.ponto = dao.load(id);
	    	    dao.deleta(ponto);
	    	    this.ponto = new Ponto();

	    }

//Outros métodos

}
public class PontoBusiness
{
	   private Session session;
    private DAO<Ponto> dao;
    private Ponto ponto;
	
	   public void salvar(Ponto ponto) {
	   	   session = HibernateUtil.getCurrentSession();
	   	   dao = new DAO<Ponto>(session, Ponto.class);
	   	   dao.salveOrUpdate(ponto);
	   }
	
	   public void merge(Ponto ponto) {
	   	   session = HibernateUtil.getCurrentSession();
	   	   dao = new DAO<Ponto>(session, Ponto.class);
	   	   session.merge(ponto);
	   }

	   public Ponto carregar(Long id) {
	   	   ponto = new Ponto();
	   	   session = HibernateUtil.getCurrentSession();
	   	   dao = new DAO<Ponto>(session, Ponto.class);
	   	   ponto = dao.load(id);
	   	   return ponto;
	   }

	   public void excluir(Ponto ponto) {
	   	   session = HibernateUtil.getCurrentSession();
	   	   DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class);
	   	   dao.deleta(ponto);
	   }
	
	   //Outros métodos
}
Não exponha o
  interior dos seus
objetos, encapsulem
   seus métodos
Esta classe apenas deve saber que o método soma recebe dois valores



public class CalculadoraTeste {

    int valorA = 1;
	 int valorB = 2;
	
//	Exemplo de DRY (Don't repeat yourself)
	 public static void main(String[] args) {
	 	
	 	 Calculadora calculadora = new Calculadora();
	 	 int resultado = calculadora.soma(valorA, valorB);
	 	 System.out.println("Resultado: " + resultado);
      }

}
O Método está em outra classe deixando invisível para classe acima



public class Calculadora {

	 public int soma(int valorA, int valorB) {
	 	 return valorA + valorB;
	 }
}
Quando usar números
   crie constantes
public class Calcula {
	
	 // retorno para array nulo
	 final int ENTRADA_INVALIDA = -1;
	 final int VALOR_ZERO = 0;



        public int somaSerie() {
	   	   if (array.length == VALOR_ZERO)
	   	   	 return ENTRADA_INVALIDA;
	   	   else if (isMaiorQueMetade(++count))
	   	   	 return VALOR_ZERO;
        }

	 // Outros métodos da classe

}
Utiliza a Herança
quando necessário
public class Funcionario {

	   private String nome;
	   private double salario;
	   private int idade;
	   private int tempoRegistro;
	   protected String cpf;

	 // Getters e Setters

}
public class Gerente extends Funcionario {
	 private int senha;
	 private int numeroDeFuncionariosGerenciados;

	 // Getters e Setters

	
}
public class GerenteTeste {

	   public static void main(String[] args) {
	   	 Funcionario funcionario = new Funcionario();
	   	 funcionario.setNome("Carlos Bergamasco");
	   	 funcionario.setSalario(5000.0);
	   	    System.out.println(funcionario.getNome()+" "+funcionario.getBonificacao());
	   	
	   	    Gerente gerente = new Gerente();
	   	    // podemos chamar metodos do Funcionario:
	   	    gerente.setNome("Eduardo Bregaida");
	   	    // e tambem metodos do Gerente!
	   	    gerente.setSenha(4231);
	   	    gerente.autentica(gerente.getSenha());
	   	    gerente.setSalario(5000.0);
	   	    System.out.println(gerente.getNome()+" "+gerente.getBonificacao());

	   	
	   }	
}
Utilize e prefira
 Polimorfismo
public abstract class Funcionario {

	   private String nome;
	   private double salario;
	   private int idade;
	   private int tempoRegistro;
	   protected String cpf;
	   private int senha;

	
	 // Getters e Setters

}
public class Gerente extends Funcionario {
	
	 private int numeroDeFuncionariosGerenciados;

	
	 // Getters e Setters

}
public class Vendedor extends Funcionario {
	 private long quantidadesVenda;

	
	 // Getters e Setters
	
}
public class PolimorfismoTeste {

	   public static void main(String[] args) {

	   	   Gerente gerente = new Gerente();
	   	   gerente.setNome("Eduardo Bregaida");
	   	   gerente.setSenha(4231);
	   	   gerente.autentica(gerente.getSenha());
	   	   gerente.setSalario(5000.0);
	   	   System.out.println("Gerente "+gerente.getNome()+" "+gerente.getBonificacao());
	   	
	   	   Vendedor vendedor = new Vendedor();
	   	   vendedor.setNome("Consani");
	   	   vendedor.setSalario(52);
	   	   System.out.println("Vendedor "+vendedor.getNome()+" "+vendedor.getSalario());


	   	   Funcionario funcionario = new Gerente();
	   	   funcionario.setNome("Carlos Bergamasco");
	   	   funcionario.getBonificacao();
	   	   funcionario.setSalario(44.0);
	   	   System.out.println("Funcionario Gerente "+funcionario.getNome()+" "+funcionario.getSalario());

	   	
	   	   funcionario = new Vendedor();
	   	   funcionario.setNome("Carlos Bergamasco");
	   	   funcionario.getBonificacao();
	   	   funcionario.setSalario(44.0);
	   	   System.out.println("Funcionario Vendedor "+funcionario.getNome()+" "+funcionario.getSalario());

	   	
	   	
	   }
}
Utilize a Interface
public abstract class Funcionario {

	   private String nome;
	   private double salario;
	   private int idade;
	   private int tempoRegistro;
	   protected String cpf;

	
	 // Getters e Setters

}
public interface Autenticavel {
	
	 public boolean autentica(int senha);
	
}
public class Gerente extends Funcionario
                         implements Autenticavel {
	   private int senha;

	   // assinatura do contrato pela interface
	   public boolean autentica(int senha) {
	   	 if (this.senha != senha) {
	   	 	 System.out.println("Acesso Permitido!");
	   	 	 return true;
	   	 } else {
	   	 	 System.out.println("Acesso Negado!");
	   	 	 return false;
	   	 }

	   }
}
Façam testes unitários
public class StringUtil {
	   public static String recuperaNomeAtributo(String nomeMetodo){
	   	   if(nomeMetodo==null) throw new IllegalArgumentException("Agurmento não pode ser nulo");
	   	   return nomeMetodo;
	   }
	
	   public static String recuperaNomeAtributoNaoPodeSerVazio(String nomeMetodo){
	   	   if(nomeMetodo.equals("")) throw new IllegalArgumentException("Agurmento não pode         ser vazio");
	   	   return nomeMetodo;
	   }
	
	   public static String recuperaNomeAtributoNaoPodeSerMenorQue4(String nomeMetodo){
	   	   if(nomeMetodo.length()<4)
             throw new IllegalArgumentException("Agurmento não pode ser menor do que 4 caracteres");
	   	   return nomeMetodo;
	   }
	
	   public static String recuperaNomeAtributoNaoPodeTerLetraMaiuscula(String nomeMetodo){
	   	   String maiuscula="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	   	   	       for(int i=0; i<nomeMetodo.length(); i++){
	   	   	          if (maiuscula.indexOf(nomeMetodo.charAt(i),0)!=-1){
	   	   	        	   throw new IllegalArgumentException("Agurmento não pode ser nulo");
	   	   	          }
	   	   	       }
	         return nomeMetodo;
	   }

}
import junit.framework.TestCase;
import br.com.cb.jUnitTes2.StringUtil;


public class StringUtilTest extends TestCase{


	   public void testRecuperaNomeAtributoNaoPodeSerNulo() throws Exception{
	   	   assertEquals("nome", StringUtil.recuperaNomeAtributo("nome"));
	   }
	
	   public void testRecuperaNomeAtributoNaoPodeSerVazio()throws Exception{
	   	   assertEquals("XPTO", StringUtil.recuperaNomeAtributoNaoPodeSerVazio("XPTO"));
	   	
	   }
	
	   public void testRecuperaNomeAtributoNaoPodeSerMenorQue4()throws Exception{
	   	   assertEquals("Abcd", StringUtil.recuperaNomeAtributoNaoPodeSerMenorQue4("Abcd"));
	   }
	
	   public void testRecuperaNomeAtributoNaoPodeTerLetraMaiuscula()throws Exception{
	   	   assertEquals("teste funfando", StringUtil.recuperaNomeAtributoNaoPodeTerLetraMaiuscula("teste funfando"));

	   }
}
TDD - Test Driven
  Development
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import br.com.cb.tdd.junit.Calculadora;

public class CalculadoraTeste {
	 Calculadora calculadora = new Calculadora();

	   @Test
	   public void deveriaSomarDoisValoresPassados() throws Exception {
	   	 assertEquals(3, calculadora.soma(1, 2));
	   }

}
public class Calculadora {

	   public int soma(int valorA, int valorB) {
	   	 return valorA + valorB;
	   }

}
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import br.com.cb.tdd.junit.Calculadora;

public class CalculadoraTeste {
	 Calculadora calculadora = new Calculadora();

	   @Test
	   public void deveriaSomarDoisValoresPassados() throws Exception {
	   	 assertEquals(3, calculadora.soma(1, 2));
	   }

	   @Test
	   public void deveriaSubtrairDoisValoresPassados() throws Exception {
	   	 assertEquals(2, calculadora.subtracao(5, 3));
	   }

	
}
public class Calculadora {

	   public int soma(int valorA, int valorB) {
	   	 return valorA + valorB;
	   }

	   public int subtracao(int valorA, int valorB) {
	   	 return valorA - valorB;
	   }

}
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import br.com.cb.tdd.junit.Calculadora;

public class CalculadoraTeste {
	 Calculadora calculadora = new Calculadora();

	   @Test
	   public void deveriaSomarDoisValoresPassados() throws Exception {
	   	 assertEquals(3, calculadora.soma(1, 2));
	   }

	   @Test
	   public void deveriaSubtrairDoisValoresPassados() throws Exception {
	   	 assertEquals(2, calculadora.subtracao(5, 3));
	   }

	   @Test
	   public void deveriaMultiplicarDoisValoresPassados() throws Exception
{
	   	   assertEquals(15, calculadora.multiplicacao(5, 3));
	   }
	
}
public class Calculadora {

	   public int soma(int valorA, int valorB) {
	   	 return valorA + valorB;
	   }

	   public int subtracao(int valorA, int valorB) {
	   	 return valorA - valorB;
	   }

	   public int multiplicacao(int valorA, int valorB) {
	   	 return valorA * valorB;
	   }

}
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import br.com.cb.tdd.junit.Calculadora;

public class CalculadoraTeste {
	 Calculadora calculadora = new Calculadora();

	   @Test
	   public void deveriaSomarDoisValoresPassados() throws Exception {
	   	 assertEquals(3, calculadora.soma(1, 2));
	   }

	   @Test
	   public void deveriaSubtrairDoisValoresPassados() throws Exception {
	   	 assertEquals(2, calculadora.subtracao(5, 3));
	   }

	   @Test
	   public void deveriaMultiplicarDoisValoresPassados() throws Exception
{
	   	   assertEquals(15, calculadora.multiplicacao(5, 3));
	   }
	
	   @Test
	   public void deveriaDividirDoisValoresPassados() throws Exception {
	   	 assertEquals(3, calculadora.divisao(9, 3));
	   }
}
public class Calculadora {

	   public int soma(int valorA, int valorB) {
	   	 return valorA + valorB;
	   }

	   public int subtracao(int valorA, int valorB) {
	   	 return valorA - valorB;
	   }

	   public int multiplicacao(int valorA, int valorB) {
	   	 return valorA * valorB;
	   }

	   public int divisao(int valorA, int valorB) {
	   	 return valorA / valorB;
	   }
}
Esse negócio aí de
   testar é chato
 demais e demora
O senhor seu Xerife
     é um fraco
Seu lugar não é
    aqui com
 profissionais
Eu desisto senhor!
Os senhores estão
   deixando seu
 capitão muito feliz
Testes mostram
    qualidade
Qualidade mostra que
     irá funcionar
Teste é o que
    diferencia
programadores de
    crianças
Estude Mocks
Há diversos
 frameworks que
facilitam o uso de
      mocks
Estude teste de
   Integração
Quer subir seu
código no controle de
      versão?
Sem teste?
Não vai subir
  ninguém
Vai todo mundo
ficar quietinho aí e
       testar
Se não testar...
Já avisei
Isso vai dar merda
Se os senhores não
   fizerem isso...
Bota ele no saco
Se persistir no erro...
Pede pra sair
Pede pra sair
Tira essa roupa
preta, porque você
não merece usar
Se não sair e não mudar
Bota na conta do papa
Dúvidas?
•   http://www.guj.com.br/


•

•
    http://blog.caelum.com.br/


    http://www.caelum.com.br/apostilas/
                                                               Para Estudar
•   http://www.klauslaube.com.br/wp-content/uploads/2011/01/
    TestDrivenGameDevelopment.png


•   http://improveit.com.br/xp/praticas/tdd


•   http://www.testdriven.com/


•   http://javafree.uol.com.br/noticia/3772/
•   http://www.caelum.com.br/apostilas/


•   http://martinfowler.com/books.html


•   http://www.slideshare.net/jeveaux/testes-e-refatorao      Para Estudar
•   http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882


•   http://www.slideshare.net/cassiomarques/refatorao-design-patterns-em-rubyhttp://compare.buscape.com.br/
    refatoracao-aperfeicoando-o-projeto-de-codigo-existente-martin-fowler-8536303956.html


•   http://www.ime.usp.br/~kon/presentations/


•   http://ccsl.ime.usp.br/pt-br/palestras


•   http://www.slideshare.net/guestd37c23/refactory-worshop
• Agradecimentos
 • Carlos Daniel Bergamasco
 • Braulio Consani
 • Christian Reichel
 • Marcelo L. Z. Ingarano
 • Adriana A. Gutierre
 • Rogério Ap. Bregaida Junior
Fim




                               Obrigado!

eduardo.bregaida@gmail.com
http://javawora.blogspot.com
 http://www.slideshare.net/
       eduardo.bregaida
          @bregaida

Mais conteúdo relacionado

Mais procurados

Tita, a pata de talita copy
Tita, a pata de talita copyTita, a pata de talita copy
Tita, a pata de talita copyMaria Terra
 
1U SILABARIO MÉTODO FÓNICO 1A.pdf
1U SILABARIO MÉTODO FÓNICO 1A.pdf1U SILABARIO MÉTODO FÓNICO 1A.pdf
1U SILABARIO MÉTODO FÓNICO 1A.pdf
SimoneHelenDrumond
 
A prática do buzzing no ensino dos instrumentos de metal
A prática do buzzing no ensino dos instrumentos de metalA prática do buzzing no ensino dos instrumentos de metal
A prática do buzzing no ensino dos instrumentos de metal
Partitura de Banda
 
Aula 5 instrução mov
Aula 5   instrução movAula 5   instrução mov
Aula 5 instrução mov
LCCIMETRO
 
Jogo complete com a letra que falta ortografia l ou u
Jogo complete com a letra que falta ortografia l ou uJogo complete com a letra que falta ortografia l ou u
Jogo complete com a letra que falta ortografia l ou u
helena machado silva
 
MTS Método CCB exercicios preenchidos, corrigido e revisado
MTS Método CCB exercicios preenchidos, corrigido e revisadoMTS Método CCB exercicios preenchidos, corrigido e revisado
MTS Método CCB exercicios preenchidos, corrigido e revisado
creito cezares
 
3346862 apostila-ingles-ensino-fundamental-t2-teachers-guide
3346862 apostila-ingles-ensino-fundamental-t2-teachers-guide3346862 apostila-ingles-ensino-fundamental-t2-teachers-guide
3346862 apostila-ingles-ensino-fundamental-t2-teachers-guide
Greicy Kelly
 
Consciência fonológica Rei capitão
Consciência fonológica   Rei capitãoConsciência fonológica   Rei capitão
Consciência fonológica Rei capitão
jeovanyazevedo1
 
Escreva os nomes das figuras e separe nas colunas corretas bra bre bri bro br...
Escreva os nomes das figuras e separe nas colunas corretas bra bre bri bro br...Escreva os nomes das figuras e separe nas colunas corretas bra bre bri bro br...
Escreva os nomes das figuras e separe nas colunas corretas bra bre bri bro br...
Diene Rodrigues Barbosa
 
302 a casa de formas geometricas
302 a casa de formas geometricas302 a casa de formas geometricas
302 a casa de formas geometricas
SimoneHelenDrumond
 
Apostila caligrafia diversas em pdf
Apostila caligrafia diversas em pdfApostila caligrafia diversas em pdf
Apostila caligrafia diversas em pdf
Cibelear Rodrigues
 
Sondagem alfabetização
Sondagem alfabetizaçãoSondagem alfabetização
Sondagem alfabetizaçãosilvinha331
 
6 LEITURA E ESCRITA BOLA BA BE BI BO BU 6A2022.pdf
6 LEITURA E ESCRITA BOLA BA BE BI BO BU 6A2022.pdf6 LEITURA E ESCRITA BOLA BA BE BI BO BU 6A2022.pdf
6 LEITURA E ESCRITA BOLA BA BE BI BO BU 6A2022.pdf
SimoneHelenDrumond
 
Campo Harmonico - Acordes
Campo Harmonico - AcordesCampo Harmonico - Acordes
Campo Harmonico - Acordes
ESMU-UEMG
 
Tabela de Pronomes em Inglês
Tabela de Pronomes em InglêsTabela de Pronomes em Inglês
Tabela de Pronomes em Inglês
Caroline Ribeiro
 
240976089 dicionario-de-acordes-para-piano-e-teclado-luciano-alves
240976089 dicionario-de-acordes-para-piano-e-teclado-luciano-alves240976089 dicionario-de-acordes-para-piano-e-teclado-luciano-alves
240976089 dicionario-de-acordes-para-piano-e-teclado-luciano-alves
Nando Costa
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
Adriano Teixeira de Souza
 
Alfabeto inglês
Alfabeto inglêsAlfabeto inglês
Alfabeto inglês
Andhré Mattos
 
Aula nº07 cifras para notas musicais
Aula nº07   cifras para notas musicaisAula nº07   cifras para notas musicais
Aula nº07 cifras para notas musicais
Nando Costa
 
Djavan
DjavanDjavan
Djavan
Tânia Mara
 

Mais procurados (20)

Tita, a pata de talita copy
Tita, a pata de talita copyTita, a pata de talita copy
Tita, a pata de talita copy
 
1U SILABARIO MÉTODO FÓNICO 1A.pdf
1U SILABARIO MÉTODO FÓNICO 1A.pdf1U SILABARIO MÉTODO FÓNICO 1A.pdf
1U SILABARIO MÉTODO FÓNICO 1A.pdf
 
A prática do buzzing no ensino dos instrumentos de metal
A prática do buzzing no ensino dos instrumentos de metalA prática do buzzing no ensino dos instrumentos de metal
A prática do buzzing no ensino dos instrumentos de metal
 
Aula 5 instrução mov
Aula 5   instrução movAula 5   instrução mov
Aula 5 instrução mov
 
Jogo complete com a letra que falta ortografia l ou u
Jogo complete com a letra que falta ortografia l ou uJogo complete com a letra que falta ortografia l ou u
Jogo complete com a letra que falta ortografia l ou u
 
MTS Método CCB exercicios preenchidos, corrigido e revisado
MTS Método CCB exercicios preenchidos, corrigido e revisadoMTS Método CCB exercicios preenchidos, corrigido e revisado
MTS Método CCB exercicios preenchidos, corrigido e revisado
 
3346862 apostila-ingles-ensino-fundamental-t2-teachers-guide
3346862 apostila-ingles-ensino-fundamental-t2-teachers-guide3346862 apostila-ingles-ensino-fundamental-t2-teachers-guide
3346862 apostila-ingles-ensino-fundamental-t2-teachers-guide
 
Consciência fonológica Rei capitão
Consciência fonológica   Rei capitãoConsciência fonológica   Rei capitão
Consciência fonológica Rei capitão
 
Escreva os nomes das figuras e separe nas colunas corretas bra bre bri bro br...
Escreva os nomes das figuras e separe nas colunas corretas bra bre bri bro br...Escreva os nomes das figuras e separe nas colunas corretas bra bre bri bro br...
Escreva os nomes das figuras e separe nas colunas corretas bra bre bri bro br...
 
302 a casa de formas geometricas
302 a casa de formas geometricas302 a casa de formas geometricas
302 a casa de formas geometricas
 
Apostila caligrafia diversas em pdf
Apostila caligrafia diversas em pdfApostila caligrafia diversas em pdf
Apostila caligrafia diversas em pdf
 
Sondagem alfabetização
Sondagem alfabetizaçãoSondagem alfabetização
Sondagem alfabetização
 
6 LEITURA E ESCRITA BOLA BA BE BI BO BU 6A2022.pdf
6 LEITURA E ESCRITA BOLA BA BE BI BO BU 6A2022.pdf6 LEITURA E ESCRITA BOLA BA BE BI BO BU 6A2022.pdf
6 LEITURA E ESCRITA BOLA BA BE BI BO BU 6A2022.pdf
 
Campo Harmonico - Acordes
Campo Harmonico - AcordesCampo Harmonico - Acordes
Campo Harmonico - Acordes
 
Tabela de Pronomes em Inglês
Tabela de Pronomes em InglêsTabela de Pronomes em Inglês
Tabela de Pronomes em Inglês
 
240976089 dicionario-de-acordes-para-piano-e-teclado-luciano-alves
240976089 dicionario-de-acordes-para-piano-e-teclado-luciano-alves240976089 dicionario-de-acordes-para-piano-e-teclado-luciano-alves
240976089 dicionario-de-acordes-para-piano-e-teclado-luciano-alves
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
 
Alfabeto inglês
Alfabeto inglêsAlfabeto inglês
Alfabeto inglês
 
Aula nº07 cifras para notas musicais
Aula nº07   cifras para notas musicaisAula nº07   cifras para notas musicais
Aula nº07 cifras para notas musicais
 
Djavan
DjavanDjavan
Djavan
 

Semelhante a Refatoração de código com Capitão Nascimento versão completa

Design OO
Design OODesign OO
Sobrecarga operadores
Sobrecarga operadoresSobrecarga operadores
Sobrecarga operadores
Itália Camolesi
 
ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09
ETEC Monsenhor Antonio Magliano
 
Exercícios java 20 02
Exercícios java 20   02Exercícios java 20   02
Exercícios java 20 02
julyesersantos
 
Clean code
Clean codeClean code
Clean code
Marcos Brizeno
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
Denis Costa
 
TDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.JsTDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.Js
tdc-globalcode
 
Aula5
Aula5Aula5
Aula5
fkimura
 
Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
Guilherme André Turci
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basico
Wemerson Silva
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2
irenescotolo
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
iMasters
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
Leonn Leite
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Tchelinux
 
Design patterns
Design patternsDesign patterns
Design patterns
DouglasSoaresAndrSch
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanos
Gregorio Kusowski
 
Programação Funcional (para humanos)
Programação Funcional (para humanos)Programação Funcional (para humanos)
Programação Funcional (para humanos)
Pedro Castilho
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional Interfaces
DevCamp Campinas
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
rafaelferreira
 
Gabarito funcoes
Gabarito funcoesGabarito funcoes
Gabarito funcoes
bferes
 

Semelhante a Refatoração de código com Capitão Nascimento versão completa (20)

Design OO
Design OODesign OO
Design OO
 
Sobrecarga operadores
Sobrecarga operadoresSobrecarga operadores
Sobrecarga operadores
 
ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09
 
Exercícios java 20 02
Exercícios java 20   02Exercícios java 20   02
Exercícios java 20 02
 
Clean code
Clean codeClean code
Clean code
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
 
TDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.JsTDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.Js
 
Aula5
Aula5Aula5
Aula5
 
Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
 
Aula actionscript basico
Aula actionscript basicoAula actionscript basico
Aula actionscript basico
 
Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2Introdução à análise orientada a objetos parte 2
Introdução à análise orientada a objetos parte 2
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanos
 
Programação Funcional (para humanos)
Programação Funcional (para humanos)Programação Funcional (para humanos)
Programação Funcional (para humanos)
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional Interfaces
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
 
Gabarito funcoes
Gabarito funcoesGabarito funcoes
Gabarito funcoes
 

Mais de Eduardo Bregaida

War Room - Bregaida - V1
War Room - Bregaida - V1War Room - Bregaida - V1
War Room - Bregaida - V1
Eduardo Bregaida
 
Feedbacks - V1
Feedbacks - V1Feedbacks - V1
Feedbacks - V1
Eduardo Bregaida
 
Treinamento Agile com Scrum - V2
Treinamento Agile com Scrum - V2Treinamento Agile com Scrum - V2
Treinamento Agile com Scrum - V2
Eduardo Bregaida
 
Treinamento Agile com scrum
Treinamento Agile com scrumTreinamento Agile com scrum
Treinamento Agile com scrum
Eduardo Bregaida
 
Aviação Civil LT sciensa
Aviação Civil  LT sciensaAviação Civil  LT sciensa
Aviação Civil LT sciensa
Eduardo Bregaida
 
Management 3.0 - V. Revisada
Management 3.0 - V. RevisadaManagement 3.0 - V. Revisada
Management 3.0 - V. Revisada
Eduardo Bregaida
 
Minha história
Minha históriaMinha história
Minha história
Eduardo Bregaida
 
DDD + BDD + TDD + Scrum
DDD + BDD + TDD + ScrumDDD + BDD + TDD + Scrum
DDD + BDD + TDD + Scrum
Eduardo Bregaida
 
Java acsp
Java acspJava acsp
Java acsp
Eduardo Bregaida
 
Aula 15 minutos
Aula 15 minutosAula 15 minutos
Aula 15 minutos
Eduardo Bregaida
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso Total
Eduardo Bregaida
 
DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015 DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015
Eduardo Bregaida
 
DDD - Linguagem Ubíqua
DDD - Linguagem UbíquaDDD - Linguagem Ubíqua
DDD - Linguagem Ubíqua
Eduardo Bregaida
 
Scrum - IMES 2013 (Remodelada)
Scrum - IMES 2013 (Remodelada)Scrum - IMES 2013 (Remodelada)
Scrum - IMES 2013 (Remodelada)
Eduardo Bregaida
 
Spring MVC - QConSP
Spring MVC - QConSPSpring MVC - QConSP
Spring MVC - QConSP
Eduardo Bregaida
 
Cultura da Empresa - um problema na Adoção Ágil - Conexão Java
Cultura da Empresa - um problema na Adoção Ágil - Conexão JavaCultura da Empresa - um problema na Adoção Ágil - Conexão Java
Cultura da Empresa - um problema na Adoção Ágil - Conexão Java
Eduardo Bregaida
 
Scrum - passos e desafios - agile tour
Scrum - passos e desafios - agile tourScrum - passos e desafios - agile tour
Scrum - passos e desafios - agile tour
Eduardo Bregaida
 
Cultura da empresa - um problema na adoção ágil
Cultura da empresa - um problema na adoção ágilCultura da empresa - um problema na adoção ágil
Cultura da empresa - um problema na adoção ágil
Eduardo Bregaida
 
Falhas nos projetos é culpa da Cultura da Empresa e não das metodologias ágeis
Falhas nos projetos é culpa da Cultura da Empresa e não das metodologias ágeisFalhas nos projetos é culpa da Cultura da Empresa e não das metodologias ágeis
Falhas nos projetos é culpa da Cultura da Empresa e não das metodologias ágeis
Eduardo Bregaida
 
Virus em Hw
Virus em HwVirus em Hw
Virus em Hw
Eduardo Bregaida
 

Mais de Eduardo Bregaida (20)

War Room - Bregaida - V1
War Room - Bregaida - V1War Room - Bregaida - V1
War Room - Bregaida - V1
 
Feedbacks - V1
Feedbacks - V1Feedbacks - V1
Feedbacks - V1
 
Treinamento Agile com Scrum - V2
Treinamento Agile com Scrum - V2Treinamento Agile com Scrum - V2
Treinamento Agile com Scrum - V2
 
Treinamento Agile com scrum
Treinamento Agile com scrumTreinamento Agile com scrum
Treinamento Agile com scrum
 
Aviação Civil LT sciensa
Aviação Civil  LT sciensaAviação Civil  LT sciensa
Aviação Civil LT sciensa
 
Management 3.0 - V. Revisada
Management 3.0 - V. RevisadaManagement 3.0 - V. Revisada
Management 3.0 - V. Revisada
 
Minha história
Minha históriaMinha história
Minha história
 
DDD + BDD + TDD + Scrum
DDD + BDD + TDD + ScrumDDD + BDD + TDD + Scrum
DDD + BDD + TDD + Scrum
 
Java acsp
Java acspJava acsp
Java acsp
 
Aula 15 minutos
Aula 15 minutosAula 15 minutos
Aula 15 minutos
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso Total
 
DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015 DDD + BDD + TDD - RF 2015
DDD + BDD + TDD - RF 2015
 
DDD - Linguagem Ubíqua
DDD - Linguagem UbíquaDDD - Linguagem Ubíqua
DDD - Linguagem Ubíqua
 
Scrum - IMES 2013 (Remodelada)
Scrum - IMES 2013 (Remodelada)Scrum - IMES 2013 (Remodelada)
Scrum - IMES 2013 (Remodelada)
 
Spring MVC - QConSP
Spring MVC - QConSPSpring MVC - QConSP
Spring MVC - QConSP
 
Cultura da Empresa - um problema na Adoção Ágil - Conexão Java
Cultura da Empresa - um problema na Adoção Ágil - Conexão JavaCultura da Empresa - um problema na Adoção Ágil - Conexão Java
Cultura da Empresa - um problema na Adoção Ágil - Conexão Java
 
Scrum - passos e desafios - agile tour
Scrum - passos e desafios - agile tourScrum - passos e desafios - agile tour
Scrum - passos e desafios - agile tour
 
Cultura da empresa - um problema na adoção ágil
Cultura da empresa - um problema na adoção ágilCultura da empresa - um problema na adoção ágil
Cultura da empresa - um problema na adoção ágil
 
Falhas nos projetos é culpa da Cultura da Empresa e não das metodologias ágeis
Falhas nos projetos é culpa da Cultura da Empresa e não das metodologias ágeisFalhas nos projetos é culpa da Cultura da Empresa e não das metodologias ágeis
Falhas nos projetos é culpa da Cultura da Empresa e não das metodologias ágeis
 
Virus em Hw
Virus em HwVirus em Hw
Virus em Hw
 

Refatoração de código com Capitão Nascimento versão completa

  • 2. Eduardo Bregaida • http://javawora.blogspot.com • @bregaida • eduardo.bregaida@gmail.com
  • 3.
  • 4.
  • 5. O Conceito de Refatoração Por Martin Fowler...
  • 6.
  • 7.
  • 8. É o processo de reescrever um programa de computador para melhorar sua estrutura ou legibilidade, preservando assim seu comportamento.
  • 9.
  • 10.
  • 11. Teve sua origem nos anos 80/90 com Smalltalk...
  • 12.
  • 13.
  • 14. Desenvolveu- se formalmente na Universidade de Illinois em Urbana-Champaign. Grupo do Prof. Ralph Johnson...
  • 15.
  • 16.
  • 18.
  • 20.
  • 21. Seu 05 está dormindo
  • 22.
  • 23.
  • 25.
  • 27.
  • 28.
  • 29. Tenha a bondade de segurar isto.
  • 30.
  • 31.
  • 32.
  • 33. Seu 05 se o senhor dormir o senhor vai se explodir, vai me explodir...
  • 34.
  • 35. E vai explodir a todos seus companheiros do FISL.
  • 36.
  • 37. O senhor vai dormir seu 05?
  • 38.
  • 40.
  • 42.
  • 43.
  • 44. Vamos analisar a motivação de refatorar
  • 45.
  • 46.
  • 48.
  • 49. Mudará algo na geração dos bytecodes?
  • 50.
  • 51. Mudará algo para o computador?
  • 52.
  • 53. Mudará algo para o cliente?
  • 54.
  • 55. Não!
  • 56.
  • 57. Facilitará para o senhor no caso de uma manutenção lembrar facilmente do código
  • 58.
  • 59. Facilitará para outros desenvolvedores entender o que o código faz
  • 60.
  • 62.
  • 63. Um exemplo de código senhores
  • 64.
  • 65.
  • 66. Dado um array de N elementos, calcular a seguinte operações:
  • 67. Dado um array de N elementos, calcular a seguinte operações: * Primeiro item menos o último
  • 68. Dado um array de N elementos, calcular a seguinte operações: * Primeiro item menos o último * O resultado dessa subtração elevado ao quadrado somado ao segundo item menos o penúltimo
  • 69. Dado um array de N elementos, calcular a seguinte operações: * Primeiro item menos o último * O resultado dessa subtração elevado ao quadrado somado ao segundo item menos o penúltimo * O resultado dessa subtração elevado ao quadrado.
  • 70. Dado um array de N elementos, calcular a seguinte operações: * Primeiro item menos o último * O resultado dessa subtração elevado ao quadrado somado ao segundo item menos o penúltimo * O resultado dessa subtração elevado ao quadrado. * uma seqüência com N elementos
  • 71. Dado um array de N elementos, calcular a seguinte operações: * Primeiro item menos o último * O resultado dessa subtração elevado ao quadrado somado ao segundo item menos o penúltimo * O resultado dessa subtração elevado ao quadrado. * uma seqüência com N elementos * (1o - N) ^2 + (2o - (N-1)) ^2 + ... + (N/2 - N/2)^2
  • 72. Dado um array de N elementos, calcular a seguinte operações: * Primeiro item menos o último * O resultado dessa subtração elevado ao quadrado somado ao segundo item menos o penúltimo * O resultado dessa subtração elevado ao quadrado. * uma seqüência com N elementos * (1o - N) ^2 + (2o - (N-1)) ^2 + ... + (N/2 - N/2)^2 * Retornar essa soma ou "-1" caso a entrada seja inválida
  • 73. public class Calcula { // contador do array static int count=-1; // método que faz o calculo solicitado public int somaSerie (int array []) { if(null == array) return -1; else if(++count>=array.length/2) // se chegou na metade, retorna zero return 0; // aplica a fórmula com chamada recursiva return ((array[count]-array[array.length-(count+1)])* (array[count]-array[array.length-(count+1)])) + somaSerie (array); } // Teste aqui? public static void main(String args[]) { int ar[] = {1,2,3,4,5,6,7,8,9,10,11}; System.out.println("Resultado=" + new Calcula().somaSerie(ar)); } }
  • 74.
  • 75. Fácil de entender senhores?
  • 76.
  • 78.
  • 79. Vamos ver como a refatoração o melhora
  • 80.
  • 81. public class CalculaRef { //Constante do valor Metade private static final int VALOR_METADE = 2; // contador do array static int count = -1; private int[] array; private int tamanho = 0; // retorno para array nulo final int ENTRADA_INVALIDA = -1; public CalculaRef(int[] array) { this.array = array; tamanho = array.length; } // mesmo cálculo efetuado na classe Calcula // mas as operações difíceis de ler // foram transformadas em métodos public int somaSerie() { if (array.length == 0) return ENTRADA_INVALIDA; else if (isMaiorQueMetade(++count)) return 0; int subtracaoValores = getPrimeiroItemArrayMenosUltimo(); return (getPotenciaQuadrado(subtracaoValores) + somaSerie()); } public int getPotenciaQuadrado(int numeroOperacao) { return numeroOperacao * numeroOperacao; } public int getPrimeiroItemArrayMenosUltimo() { return array[count] - array[tamanho - (count + 1)]; } public boolean isMaiorQueMetade(int indice) { return indice >= tamanho / VALOR_METADE; } }
  • 82. /** * Classe de Teste */ public class CalculaRefTeste { public static void main(String args[]) { int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; CalculaRef refTeste = new CalculaRef(ar); System.out.println("Resultado=" + refTeste.somaSerie()); } }
  • 83.
  • 85.
  • 86. public class CalculaRefDois { // contador deixou de ser estático e passou a ser um atributo private int count = -1; // array possui agora uma classe para efetuar suas operações específicas private ArrayUtil arrayUtil; final int ENTRADA_INVALIDA = -1; public CalculaRefDois(int[] array) { // inicializa classe do array this.arrayUtil = new ArrayUtil(array); } // ficou quase igual ao método da classe CalculaRefHum a diferença // é que o IF e o ELSE IF chamam métodos da classe nova a ArrayUtils public int somaSerie() { if (arrayUtil.getTamanho() == 0) return ENTRADA_INVALIDA; else if (arrayUtil.isMaiorQueMetade(++count)) return 0; int subtracaoValores = getPrimeiroItemArrayMenosUltimo(); return (getPotenciaQuadrado(subtracaoValores) + somaSerie()); } public int getPotenciaQuadrado(int valorSubtracao) { // Utilizando a lib Math do Java na qual já cálcula um valor passado e seu expoente //Cast de int pois pow retorna double return (int) Math.pow(valorSubtracao,EXPOENTE_QUADRADO); } public int getPrimeiroItemArrayMenosUltimo() { return arrayUtil.getItem(count) - arrayUtil.getItemIndiceInverso(count); } }
  • 87. public class ArrayUtil { private int array[]; private int tamanho = 0; private static final int VALOR_HUM = 1; //Constante do valor Metade private static final int VALOR_METADE = 2; public ArrayUtil(int array[]) { this.array = array; if (null == array) this.array = new int[] {}; tamanho = this.array.length; } public int getIndiceIntermediario() { return tamanho / VALOR_METADE; } public int getTamanho() { return tamanho; } public int getItem(int indice) { return array[indice]; } public int getItemIndiceInverso(int indice) { return array[tamanho - (indice + VALOR_HUM)]; } public boolean isMaiorQueMetade(int indice) { return indice >= getIndiceIntermediario(); } }
  • 88.
  • 89. Senhor, o que é preciso para refatorar?
  • 90.
  • 91.
  • 92. Xerife, o senhor precisa testar o código
  • 93.
  • 94. Xerife, o senhor precisa sentir o “mau cheiro” do código!
  • 95.
  • 96.
  • 97. O que seria sentir o “mau cheiro” do código senhor?
  • 98.
  • 99.
  • 100. Classes com muitas responsabilidades
  • 101.
  • 102. Um código sem padrão algum
  • 103.
  • 104.
  • 105. Sistemas sem alta coesão e baixo acoplamento
  • 106.
  • 107.
  • 108. Ah, mas isso dá muito trabalho senhor
  • 109.
  • 110.
  • 111. Xerife
  • 112.
  • 113. O senhor é um fanfarrão seu Xerife
  • 114.
  • 115.
  • 116. Os senhores têm que refatorar sempre
  • 117.
  • 118. public class PontoHandler { private Ponto ponto = new Ponto(); private Session session; private DAO<Ponto> dao; public void salvar() { session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); if (ponto.getId() == 0) { dao.salveOrUpdate(this.ponto); } else { session.merge(this.ponto); } this.ponto = new Ponto(); } public void carregar(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id); } public void excluir(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id); dao.deleta(ponto); this.ponto = new Ponto(); } //Outros métodos }
  • 119.
  • 121.
  • 122. Dêem nomes decentes aos métodos e os parâmetros
  • 123.
  • 124. public class PontoHandler { private Ponto ponto = new Ponto(); private PontoBusiness negocio = new PontoBusiness(); private Long id ; public void salvar() { if (ponto.getId() == 0) { negocio.salvar(this.ponto); } else { negocio.merge(this.ponto); } this.ponto = new Ponto(); } public void carregar(ActionEvent event) { id = populaDados(event); this.ponto = negocio.carregar(id); } public void excluir(ActionEvent event) { id = populaDados(event); this.ponto = negocio.carregar(id); negocio.excluir(ponto); this.ponto = new Ponto(); } public List<Ponto> getAllPonto() { return negocio.getAllPontos(); } /** * Popula os dados dos componentes JSF * @param event * @return id */ private Long populaDados(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink.findComponent("editId"); Long id = (Long) parameter.getValue(); return id; } //Outros métodos }
  • 125.
  • 126. Os nomes dos métodos e parâmetros tem que ser condizentes com o que eles fazem
  • 127.
  • 128. public class PontoHandler { private Ponto ponto = new Ponto(); private Session session; private DAO<Ponto> dao; public void salvar() { //Implementação } public void carregar(ActionEvent event) { //Implementação } public void excluir(ActionEvent event) { //Implementação } }
  • 129.
  • 130. Os métodos e classes devem ser pequenos
  • 131.
  • 132. public class PontoHandler { private Ponto ponto = new Ponto(); private Session session; private DAO<Ponto> dao; public void salvar() { session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); if (ponto.getId() == 0) { dao.salveOrUpdate(this.ponto); } else { session.merge(this.ponto); } this.ponto = new Ponto(); } public void carregar(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id); } public void excluir(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id); dao.deleta(ponto); this.ponto = new Ponto(); } //Outros métodos }
  • 133. public class PontoHandler { private Ponto ponto = new Ponto(); private PontoBusiness negocio = new PontoBusiness(); private Long id ; public void salvar() { if (ponto.getId() == 0) { negocio.salvar(this.ponto); } else { negocio.merge(this.ponto); } this.ponto = new Ponto(); } public void carregar(ActionEvent event) { id = populaDados(event); this.ponto = negocio.carregar(id); } public void excluir(ActionEvent event) { id = populaDados(event); this.ponto = negocio.carregar(id); negocio.excluir(ponto); this.ponto = new Ponto(); } /** * Popula os dados dos componentes JSF * @param event * @return id */ private Long populaDados(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink.findComponent("editId"); Long id = (Long) parameter.getValue(); return id; } //Outros métodos }
  • 134.
  • 136.
  • 138.
  • 139. /** * @author eduardobregaida * PontoHandler * ManagedBean para fazer a ponte entre a View e o Controller */ public class PontoHandler { // Classe de Ponto do ônibus private Ponto ponto = new Ponto(); // Classe da Linha do ônibus private Linha linha = new Linha(); // Método para Salvar um Ponto public void salvar() { if (ponto.getId() == 0) { negocio.salvar(this.ponto); } else { negocio.merge(this.ponto); } this.ponto = new Ponto(); } // Método para excluir um ponto recebe um evento do componente public void excluir(ActionEvent event) { id = populaDados(event); this.ponto = negocio.carregar(id); negocio.excluir(ponto); this.ponto = new Ponto(); } }
  • 140.
  • 141. Tire as responsabilidades a mais nas classes
  • 142.
  • 143. public class PontoHandler { private Ponto ponto = new Ponto(); private Session session; private DAO<Ponto> dao; public void salvar() { session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); if (ponto.getId() == 0) { dao.salveOrUpdate(this.ponto); } else { session.merge(this.ponto); } this.ponto = new Ponto(); } public void carregar(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id); } public void excluir(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id); dao.deleta(ponto); this.ponto = new Ponto(); } //Outros métodos }
  • 144. public class PontoBusiness { private Session session; private DAO<Ponto> dao; private Ponto ponto; public void salvar(Ponto ponto) { session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); dao.salveOrUpdate(ponto); } public void merge(Ponto ponto) { session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); session.merge(ponto); } public Ponto carregar(Long id) { ponto = new Ponto(); session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); ponto = dao.load(id); return ponto; } public void excluir(Ponto ponto) { session = HibernateUtil.getCurrentSession(); DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class); dao.deleta(ponto); } //Outros métodos }
  • 145.
  • 146. Não exponha o interior dos seus objetos, encapsulem seus métodos
  • 147.
  • 148. Esta classe apenas deve saber que o método soma recebe dois valores public class CalculadoraTeste { int valorA = 1; int valorB = 2; // Exemplo de DRY (Don't repeat yourself) public static void main(String[] args) { Calculadora calculadora = new Calculadora(); int resultado = calculadora.soma(valorA, valorB); System.out.println("Resultado: " + resultado); } }
  • 149. O Método está em outra classe deixando invisível para classe acima public class Calculadora { public int soma(int valorA, int valorB) { return valorA + valorB; } }
  • 150.
  • 151. Quando usar números crie constantes
  • 152.
  • 153. public class Calcula { // retorno para array nulo final int ENTRADA_INVALIDA = -1; final int VALOR_ZERO = 0; public int somaSerie() { if (array.length == VALOR_ZERO) return ENTRADA_INVALIDA; else if (isMaiorQueMetade(++count)) return VALOR_ZERO; } // Outros métodos da classe }
  • 154.
  • 156.
  • 157. public class Funcionario { private String nome; private double salario; private int idade; private int tempoRegistro; protected String cpf; // Getters e Setters }
  • 158. public class Gerente extends Funcionario { private int senha; private int numeroDeFuncionariosGerenciados; // Getters e Setters }
  • 159. public class GerenteTeste { public static void main(String[] args) { Funcionario funcionario = new Funcionario(); funcionario.setNome("Carlos Bergamasco"); funcionario.setSalario(5000.0); System.out.println(funcionario.getNome()+" "+funcionario.getBonificacao()); Gerente gerente = new Gerente(); // podemos chamar metodos do Funcionario: gerente.setNome("Eduardo Bregaida"); // e tambem metodos do Gerente! gerente.setSenha(4231); gerente.autentica(gerente.getSenha()); gerente.setSalario(5000.0); System.out.println(gerente.getNome()+" "+gerente.getBonificacao()); } }
  • 160.
  • 161. Utilize e prefira Polimorfismo
  • 162.
  • 163. public abstract class Funcionario { private String nome; private double salario; private int idade; private int tempoRegistro; protected String cpf; private int senha; // Getters e Setters }
  • 164. public class Gerente extends Funcionario { private int numeroDeFuncionariosGerenciados; // Getters e Setters }
  • 165. public class Vendedor extends Funcionario { private long quantidadesVenda; // Getters e Setters }
  • 166. public class PolimorfismoTeste { public static void main(String[] args) { Gerente gerente = new Gerente(); gerente.setNome("Eduardo Bregaida"); gerente.setSenha(4231); gerente.autentica(gerente.getSenha()); gerente.setSalario(5000.0); System.out.println("Gerente "+gerente.getNome()+" "+gerente.getBonificacao()); Vendedor vendedor = new Vendedor(); vendedor.setNome("Consani"); vendedor.setSalario(52); System.out.println("Vendedor "+vendedor.getNome()+" "+vendedor.getSalario()); Funcionario funcionario = new Gerente(); funcionario.setNome("Carlos Bergamasco"); funcionario.getBonificacao(); funcionario.setSalario(44.0); System.out.println("Funcionario Gerente "+funcionario.getNome()+" "+funcionario.getSalario()); funcionario = new Vendedor(); funcionario.setNome("Carlos Bergamasco"); funcionario.getBonificacao(); funcionario.setSalario(44.0); System.out.println("Funcionario Vendedor "+funcionario.getNome()+" "+funcionario.getSalario()); } }
  • 167.
  • 169.
  • 170. public abstract class Funcionario { private String nome; private double salario; private int idade; private int tempoRegistro; protected String cpf; // Getters e Setters }
  • 171. public interface Autenticavel { public boolean autentica(int senha); }
  • 172. public class Gerente extends Funcionario implements Autenticavel { private int senha; // assinatura do contrato pela interface public boolean autentica(int senha) { if (this.senha != senha) { System.out.println("Acesso Permitido!"); return true; } else { System.out.println("Acesso Negado!"); return false; } } }
  • 173.
  • 175.
  • 176. public class StringUtil { public static String recuperaNomeAtributo(String nomeMetodo){ if(nomeMetodo==null) throw new IllegalArgumentException("Agurmento não pode ser nulo"); return nomeMetodo; } public static String recuperaNomeAtributoNaoPodeSerVazio(String nomeMetodo){ if(nomeMetodo.equals("")) throw new IllegalArgumentException("Agurmento não pode ser vazio"); return nomeMetodo; } public static String recuperaNomeAtributoNaoPodeSerMenorQue4(String nomeMetodo){ if(nomeMetodo.length()<4) throw new IllegalArgumentException("Agurmento não pode ser menor do que 4 caracteres"); return nomeMetodo; } public static String recuperaNomeAtributoNaoPodeTerLetraMaiuscula(String nomeMetodo){ String maiuscula="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for(int i=0; i<nomeMetodo.length(); i++){ if (maiuscula.indexOf(nomeMetodo.charAt(i),0)!=-1){ throw new IllegalArgumentException("Agurmento não pode ser nulo"); } } return nomeMetodo; } }
  • 177. import junit.framework.TestCase; import br.com.cb.jUnitTes2.StringUtil; public class StringUtilTest extends TestCase{ public void testRecuperaNomeAtributoNaoPodeSerNulo() throws Exception{ assertEquals("nome", StringUtil.recuperaNomeAtributo("nome")); } public void testRecuperaNomeAtributoNaoPodeSerVazio()throws Exception{ assertEquals("XPTO", StringUtil.recuperaNomeAtributoNaoPodeSerVazio("XPTO")); } public void testRecuperaNomeAtributoNaoPodeSerMenorQue4()throws Exception{ assertEquals("Abcd", StringUtil.recuperaNomeAtributoNaoPodeSerMenorQue4("Abcd")); } public void testRecuperaNomeAtributoNaoPodeTerLetraMaiuscula()throws Exception{ assertEquals("teste funfando", StringUtil.recuperaNomeAtributoNaoPodeTerLetraMaiuscula("teste funfando")); } }
  • 178.
  • 179. TDD - Test Driven Development
  • 180.
  • 181.
  • 182. import static org.junit.Assert.assertEquals; import org.junit.Test; import br.com.cb.tdd.junit.Calculadora; public class CalculadoraTeste { Calculadora calculadora = new Calculadora(); @Test public void deveriaSomarDoisValoresPassados() throws Exception { assertEquals(3, calculadora.soma(1, 2)); } }
  • 183. public class Calculadora { public int soma(int valorA, int valorB) { return valorA + valorB; } }
  • 184.
  • 185. import static org.junit.Assert.assertEquals; import org.junit.Test; import br.com.cb.tdd.junit.Calculadora; public class CalculadoraTeste { Calculadora calculadora = new Calculadora(); @Test public void deveriaSomarDoisValoresPassados() throws Exception { assertEquals(3, calculadora.soma(1, 2)); } @Test public void deveriaSubtrairDoisValoresPassados() throws Exception { assertEquals(2, calculadora.subtracao(5, 3)); } }
  • 186. public class Calculadora { public int soma(int valorA, int valorB) { return valorA + valorB; } public int subtracao(int valorA, int valorB) { return valorA - valorB; } }
  • 187.
  • 188. import static org.junit.Assert.assertEquals; import org.junit.Test; import br.com.cb.tdd.junit.Calculadora; public class CalculadoraTeste { Calculadora calculadora = new Calculadora(); @Test public void deveriaSomarDoisValoresPassados() throws Exception { assertEquals(3, calculadora.soma(1, 2)); } @Test public void deveriaSubtrairDoisValoresPassados() throws Exception { assertEquals(2, calculadora.subtracao(5, 3)); } @Test public void deveriaMultiplicarDoisValoresPassados() throws Exception { assertEquals(15, calculadora.multiplicacao(5, 3)); } }
  • 189. public class Calculadora { public int soma(int valorA, int valorB) { return valorA + valorB; } public int subtracao(int valorA, int valorB) { return valorA - valorB; } public int multiplicacao(int valorA, int valorB) { return valorA * valorB; } }
  • 190.
  • 191. import static org.junit.Assert.assertEquals; import org.junit.Test; import br.com.cb.tdd.junit.Calculadora; public class CalculadoraTeste { Calculadora calculadora = new Calculadora(); @Test public void deveriaSomarDoisValoresPassados() throws Exception { assertEquals(3, calculadora.soma(1, 2)); } @Test public void deveriaSubtrairDoisValoresPassados() throws Exception { assertEquals(2, calculadora.subtracao(5, 3)); } @Test public void deveriaMultiplicarDoisValoresPassados() throws Exception { assertEquals(15, calculadora.multiplicacao(5, 3)); } @Test public void deveriaDividirDoisValoresPassados() throws Exception { assertEquals(3, calculadora.divisao(9, 3)); } }
  • 192. public class Calculadora { public int soma(int valorA, int valorB) { return valorA + valorB; } public int subtracao(int valorA, int valorB) { return valorA - valorB; } public int multiplicacao(int valorA, int valorB) { return valorA * valorB; } public int divisao(int valorA, int valorB) { return valorA / valorB; } }
  • 193.
  • 194.
  • 195. Esse negócio aí de testar é chato demais e demora
  • 196.
  • 197.
  • 198. O senhor seu Xerife é um fraco
  • 199.
  • 200. Seu lugar não é aqui com profissionais
  • 201.
  • 203.
  • 204.
  • 205. Os senhores estão deixando seu capitão muito feliz
  • 206.
  • 207.
  • 208.
  • 209. Testes mostram qualidade
  • 210.
  • 211. Qualidade mostra que irá funcionar
  • 212.
  • 213. Teste é o que diferencia programadores de crianças
  • 214.
  • 216.
  • 217. Há diversos frameworks que facilitam o uso de mocks
  • 218.
  • 219. Estude teste de Integração
  • 220.
  • 221.
  • 222. Quer subir seu código no controle de versão?
  • 223.
  • 225.
  • 226.
  • 227. Não vai subir ninguém
  • 228.
  • 229. Vai todo mundo ficar quietinho aí e testar
  • 230.
  • 231.
  • 233.
  • 235.
  • 236. Isso vai dar merda
  • 237.
  • 238.
  • 239. Se os senhores não fizerem isso...
  • 240.
  • 241. Bota ele no saco
  • 242.
  • 243.
  • 244.
  • 245. Se persistir no erro...
  • 246.
  • 247.
  • 249.
  • 251.
  • 252.
  • 253. Tira essa roupa preta, porque você não merece usar
  • 254.
  • 255.
  • 256. Se não sair e não mudar
  • 257.
  • 258. Bota na conta do papa
  • 259.
  • 260.
  • 261.
  • 262.
  • 264. http://www.guj.com.br/ • • http://blog.caelum.com.br/ http://www.caelum.com.br/apostilas/ Para Estudar • http://www.klauslaube.com.br/wp-content/uploads/2011/01/ TestDrivenGameDevelopment.png • http://improveit.com.br/xp/praticas/tdd • http://www.testdriven.com/ • http://javafree.uol.com.br/noticia/3772/
  • 265. http://www.caelum.com.br/apostilas/ • http://martinfowler.com/books.html • http://www.slideshare.net/jeveaux/testes-e-refatorao Para Estudar • http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882 • http://www.slideshare.net/cassiomarques/refatorao-design-patterns-em-rubyhttp://compare.buscape.com.br/ refatoracao-aperfeicoando-o-projeto-de-codigo-existente-martin-fowler-8536303956.html • http://www.ime.usp.br/~kon/presentations/ • http://ccsl.ime.usp.br/pt-br/palestras • http://www.slideshare.net/guestd37c23/refactory-worshop
  • 266. • Agradecimentos • Carlos Daniel Bergamasco • Braulio Consani • Christian Reichel • Marcelo L. Z. Ingarano • Adriana A. Gutierre • Rogério Ap. Bregaida Junior
  • 267. Fim Obrigado! eduardo.bregaida@gmail.com http://javawora.blogspot.com http://www.slideshare.net/ eduardo.bregaida @bregaida