Refatoração comCapitão Nascimento    Eduardo Bregaida
Eduardo Bregaida•   http://javawora.blogspot.com•   @bregaida•   eduardo.bregaida@gmail.com
O Conceito de    RefatoraçãoPor Martin Fowler...
É o processo dereescrever um programa   de computador paramelhorar sua estrutura oulegibilidade, preservando         assim...
Teve sua origem nos anos  80/90 com Smalltalk...
Desenvolveu-   se formalmente naUniversidade 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 dormiro senhor vai se explodir, vaime 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 outrosdesenvolvedores 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...
Dado um array de N elementos, calcular a seguinte operações:   * Primeiro item menos o último   * O resultado dessa subtra...
Dado um array de N elementos, calcular a seguinte operações:   * Primeiro item menos o último   * O resultado dessa subtra...
Dado um array de N elementos, calcular a seguinte operações:   * Primeiro item menos o último   * O resultado dessa subtra...
Dado um array de N elementos, calcular a seguinte operações:   * Primeiro item menos o último   * O resultado dessa subtra...
public class Calcula{	   // contador do array     static int count=-1;       // método que faz o calculo solicitado       ...
Fácil de entender senhores?
Não...
Vamos ver como arefatoração o melhora
public class CalculaRef {	   //Constante do valor Metade	   private static final int VALOR_METADE = 2;		   // contador do ...
/**  * Classe de Teste  */public class CalculaRefTeste {		 public static void main(String args[]) {	 	 int ar[] = { 1, 2, ...
Podemos melhorar mais...
public class CalculaRefDois {	   // contador deixou de ser estático e passou a ser um atributo	   private int count = -1;	...
public class ArrayUtil {    	   private int array[];    	   private int tamanho = 0;	       private static final int VALOR...
Senhor, o que é preciso para         refatorar?
Xerife, o senhor precisa     testar o código
Xerife, o senhor precisasentir o “mau cheiro” do         código!
O que seria sentir o “maucheiro” 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êmque refatorar sempre
public class PontoHandler {	    private Ponto ponto = new Ponto();	    private Session session;     private DAO<Ponto> dao...
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();	...
Os nomes dos métodos e parâmetrostem que ser condizentes com o que eles fazem
public class PontoHandler {	   private Ponto ponto = new Ponto();	   private Session session;    private DAO<Ponto> dao;	 ...
Os métodos e classes devem ser pequenos
public class PontoHandler {	    private Ponto ponto = new Ponto();	    private Session session;     private DAO<Ponto> dao...
public class PontoHandler {	   private Ponto ponto = new Ponto();	   private PontoBusiness negocio = new PontoBusiness();	...
Criecomentários no   código
Utilize o JavaDoc
/**  * @author eduardobregaida  * PontoHandler  * ManagedBean para fazer a ponte entre a View e o Controller  */public cla...
Tire as responsabilidades     a mais nas classes
public class PontoHandler {	    private Ponto ponto = new Ponto();	    private Session session;     private DAO<Ponto> dao...
public class PontoBusiness{	   private Session session;    private DAO<Ponto> dao;    private Ponto ponto;		   public void...
Não exponha o  interior dos seusobjetos, encapsulem   seus métodos
Esta classe apenas deve saber que o método soma recebe dois valorespublic class CalculadoraTeste {    int valorA = 1;	 int...
O Método está em outra classe deixando invisível para classe acimapublic class Calculadora {	 public int soma(int valorA, ...
Quando usar números   crie constantes
public class Calcula {		 // retorno para array nulo	 final int ENTRADA_INVALIDA = -1;	 final int VALOR_ZERO = 0;        pu...
Utiliza a Herançaquando necessário
public class Funcionario {	   private String nome;	   private double salario;	   private int idade;	   private int tempoRe...
public class Gerente extends Funcionario {	 private int senha;	 private int numeroDeFuncionariosGerenciados;	 // Getters e...
public class GerenteTeste {	   public static void main(String[] args) {	   	 Funcionario funcionario = new Funcionario();	...
Utilize e prefira Polimorfismo
public abstract class Funcionario {	   private String nome;	   private double salario;	   private int idade;	   private in...
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();	   	 ...
Utilize a Interface
public abstract class Funcionario {	   private String nome;	   private double salario;	   private int idade;	   private in...
public interface Autenticavel {		 public boolean autentica(int senha);	}
public class Gerente extends Funcionario                         implements Autenticavel {	   private int senha;	   // ass...
Façam testes unitários
public class StringUtil {	   public static String recuperaNomeAtributo(String nomeMetodo){	   	   if(nomeMetodo==null) thr...
import junit.framework.TestCase;import br.com.cb.jUnitTes2.StringUtil;public class StringUtilTest extends TestCase{	   pub...
TDD - Test Driven  Development
import static org.junit.Assert.assertEquals;import org.junit.Test;import br.com.cb.tdd.junit.Calculadora;public class Calc...
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 Calc...
public class Calculadora {	   public int soma(int valorA, int valorB) {	   	 return valorA + valorB;	   }	   public int su...
import static org.junit.Assert.assertEquals;import org.junit.Test;import br.com.cb.tdd.junit.Calculadora;public class Calc...
public class Calculadora {	   public int soma(int valorA, int valorB) {	   	 return valorA + valorB;	   }	   public int su...
import static org.junit.Assert.assertEquals;import org.junit.Test;import br.com.cb.tdd.junit.Calculadora;public class Calc...
public class Calculadora {	   public int soma(int valorA, int valorB) {	   	 return valorA + valorB;	   }	   public int su...
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    diferenciaprogramadores de    crianças
Estude Mocks
Há diversos frameworks quefacilitam o uso de      mocks
Estude teste de   Integração
Quer subir seucódigo no controle de      versão?
Sem teste?
Não vai subir  ninguém
Vai todo mundoficar 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 roupapreta, 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/                         ...
•   http://www.caelum.com.br/apostilas/•   http://martinfowler.com/books.html•   http://www.slideshare.net/jeveaux/testes-...
• Agradecimentos • Carlos Daniel Bergamasco • Braulio Consani • Christian Reichel • Marcelo L. Z. Ingarano • Adriana A. Gu...
Fim                               Obrigado!eduardo.bregaida@gmail.comhttp://javawora.blogspot.com http://www.slideshare.ne...
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Próximos SlideShares
Carregando em…5
×

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

4.488 visualizações

Publicada em

Palestra apresentada no FISL 12 Edição.

Publicada em: Tecnologia, Diversão e humor
4 comentários
4 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
4.488
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1.087
Ações
Compartilhamentos
0
Downloads
68
Comentários
4
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. Refatoração comCapitão Nascimento Eduardo Bregaida
  2. 2. Eduardo Bregaida• http://javawora.blogspot.com• @bregaida• eduardo.bregaida@gmail.com
  3. 3. O Conceito de RefatoraçãoPor Martin Fowler...
  4. 4. É o processo dereescrever um programa de computador paramelhorar sua estrutura oulegibilidade, preservando assim seu comportamento.
  5. 5. Teve sua origem nos anos 80/90 com Smalltalk...
  6. 6. Desenvolveu- se formalmente naUniversidade de Illinois em Urbana-Champaign. Grupo do Prof. Ralph Johnson...
  7. 7. Capitão?
  8. 8. Pois não?
  9. 9. Seu 05 está dormindo
  10. 10. Seu 05
  11. 11. Senhor?
  12. 12. Tenha a bondade de segurar isto.
  13. 13. Seu 05 se o senhor dormiro senhor vai se explodir, vaime explodir...
  14. 14. E vai explodir a todos seus companheiros do FISL.
  15. 15. O senhor vai dormir seu 05?
  16. 16. Não Senhor!
  17. 17. Estamos todos confiando no senhor.
  18. 18. Vamos analisar a motivação de refatorar
  19. 19. Por que refatorar?
  20. 20. Mudará algo na geração dos bytecodes?
  21. 21. Mudará algo para o computador?
  22. 22. Mudará algo para o cliente?
  23. 23. Não!
  24. 24. Facilitará para o senhor no caso de uma manutenção lembrar facilmente do código
  25. 25. Facilitará para outrosdesenvolvedores entender o que o código faz
  26. 26. Manutenibilidade
  27. 27. Um exemplo de código senhores
  28. 28. Dado um array de N elementos, calcular a seguinte operações:
  29. 29. Dado um array de N elementos, calcular a seguinte operações: * Primeiro item menos o último
  30. 30. 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
  31. 31. 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.
  32. 32. 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
  33. 33. 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
  34. 34. 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
  35. 35. 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, retornazero 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)); }}
  36. 36. Fácil de entender senhores?
  37. 37. Não...
  38. 38. Vamos ver como arefatoração o melhora
  39. 39. 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; }}
  40. 40. /** * 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()); }}
  41. 41. Podemos melhorar mais...
  42. 42. 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); }}
  43. 43. 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(); } }
  44. 44. Senhor, o que é preciso para refatorar?
  45. 45. Xerife, o senhor precisa testar o código
  46. 46. Xerife, o senhor precisasentir o “mau cheiro” do código!
  47. 47. O que seria sentir o “maucheiro” do código senhor?
  48. 48. Classes com muitas responsabilidades
  49. 49. Um código sem padrão algum
  50. 50. Sistemas sem alta coesão e baixo acoplamento
  51. 51. Ah, mas isso dá muito trabalho senhor
  52. 52. Xerife
  53. 53. O senhor é um fanfarrão seu Xerife
  54. 54. Os senhores têmque refatorar sempre
  55. 55. 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}
  56. 56. Eliminem a duplicidade
  57. 57. Dêem nomes decentes aos métodos e os parâmetros
  58. 58. 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}
  59. 59. Os nomes dos métodos e parâmetrostem que ser condizentes com o que eles fazem
  60. 60. 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 }}
  61. 61. Os métodos e classes devem ser pequenos
  62. 62. 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}
  63. 63. 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}
  64. 64. Criecomentários no código
  65. 65. Utilize o JavaDoc
  66. 66. /** * @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(); }}
  67. 67. Tire as responsabilidades a mais nas classes
  68. 68. 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}
  69. 69. 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}
  70. 70. Não exponha o interior dos seusobjetos, encapsulem seus métodos
  71. 71. Esta classe apenas deve saber que o método soma recebe dois valorespublic class CalculadoraTeste { int valorA = 1; int valorB = 2; // Exemplo de DRY (Dont repeat yourself) public static void main(String[] args) { Calculadora calculadora = new Calculadora(); int resultado = calculadora.soma(valorA, valorB); System.out.println("Resultado: " + resultado); }}
  72. 72. O Método está em outra classe deixando invisível para classe acimapublic class Calculadora { public int soma(int valorA, int valorB) { return valorA + valorB; }}
  73. 73. Quando usar números crie constantes
  74. 74. 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}
  75. 75. Utiliza a Herançaquando necessário
  76. 76. public class Funcionario { private String nome; private double salario; private int idade; private int tempoRegistro; protected String cpf; // Getters e Setters}
  77. 77. public class Gerente extends Funcionario { private int senha; private int numeroDeFuncionariosGerenciados; // Getters e Setters }
  78. 78. 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()); } }
  79. 79. Utilize e prefira Polimorfismo
  80. 80. 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}
  81. 81. public class Gerente extends Funcionario { private int numeroDeFuncionariosGerenciados; // Getters e Setters}
  82. 82. public class Vendedor extends Funcionario { private long quantidadesVenda; // Getters e Setters }
  83. 83. 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()); }}
  84. 84. Utilize a Interface
  85. 85. public abstract class Funcionario { private String nome; private double salario; private int idade; private int tempoRegistro; protected String cpf; // Getters e Setters}
  86. 86. public interface Autenticavel { public boolean autentica(int senha); }
  87. 87. 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; } }}
  88. 88. Façam testes unitários
  89. 89. 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; }}
  90. 90. 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")); }}
  91. 91. TDD - Test Driven Development
  92. 92. 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)); }}
  93. 93. public class Calculadora { public int soma(int valorA, int valorB) { return valorA + valorB; }}
  94. 94. 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)); } }
  95. 95. public class Calculadora { public int soma(int valorA, int valorB) { return valorA + valorB; } public int subtracao(int valorA, int valorB) { return valorA - valorB; }}
  96. 96. 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)); } }
  97. 97. 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; }}
  98. 98. 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)); }}
  99. 99. 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; }}
  100. 100. Esse negócio aí de testar é chato demais e demora
  101. 101. O senhor seu Xerife é um fraco
  102. 102. Seu lugar não é aqui com profissionais
  103. 103. Eu desisto senhor!
  104. 104. Os senhores estão deixando seu capitão muito feliz
  105. 105. Testes mostram qualidade
  106. 106. Qualidade mostra que irá funcionar
  107. 107. Teste é o que diferenciaprogramadores de crianças
  108. 108. Estude Mocks
  109. 109. Há diversos frameworks quefacilitam o uso de mocks
  110. 110. Estude teste de Integração
  111. 111. Quer subir seucódigo no controle de versão?
  112. 112. Sem teste?
  113. 113. Não vai subir ninguém
  114. 114. Vai todo mundoficar quietinho aí e testar
  115. 115. Se não testar...
  116. 116. Já avisei
  117. 117. Isso vai dar merda
  118. 118. Se os senhores não fizerem isso...
  119. 119. Bota ele no saco
  120. 120. Se persistir no erro...
  121. 121. Pede pra sair
  122. 122. Pede pra sair
  123. 123. Tira essa roupapreta, porque vocênão merece usar
  124. 124. Se não sair e não mudar
  125. 125. Bota na conta do papa
  126. 126. Dúvidas?
  127. 127. • 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/
  128. 128. • 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
  129. 129. • Agradecimentos • Carlos Daniel Bergamasco • Braulio Consani • Christian Reichel • Marcelo L. Z. Ingarano • Adriana A. Gutierre • Rogério Ap. Bregaida Junior
  130. 130. Fim Obrigado!eduardo.bregaida@gmail.comhttp://javawora.blogspot.com http://www.slideshare.net/ eduardo.bregaida @bregaida

×