Técnicas de Refactoring

1.161 visualizações

Publicada em

Técnicas de Refactoring

Publicada em: Tecnologia
0 comentários
11 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.161
No SlideShare
0
A partir de incorporações
0
Número de incorporações
54
Ações
Compartilhamentos
0
Downloads
0
Comentários
0
Gostaram
11
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Técnicas de Refactoring

  1. 1. Técnicas de Refactoring Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br
  2. 2. “Transformar equipes de desenvolvimento de software” http://www.agilecode.com.br
  3. 3. Rodrigo Branas rodrigo.branas@agilecode.com.br http://www.agilecode.com.br • Desenvolvendo Software na Gennera • Criando treinamentos na Agile Code • Escrevendo na Java Magazine e PacktPub • Palestrando sobre desenvolvimento de software em eventos, universidades e empresas
  4. 4. Certificações Formação Acadêmica Ciências da Computação – UFSC Gerenciamento de Projetos - FGV SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM Experiência Há mais de 12 anos desenvolvendo software na plataforma Java com as empresas: EDS, HP, NET, Citibank, GM, Dígitro, Softplan, OnCast, Senai, VALE, RBS, Unimed, Globalcode, V.Office, Suntech, WPlex e Gennera.
  5. 5. • Há mais de 5 anos liderando pessoas. • Mais de 2000 horas em sala de aula. • Mais de 100 apresentações em eventos. • 6 artigos escritos para revistas. • 1 livro. • Mais de 500 profissionais treinados. • Criação de 22 palestras. • Criação de 10 treinamentos. • Criação de mais de 3.000 slides.
  6. 6. Compondo métodos
  7. 7. Extrair Método
  8. 8. Existe um fragmento de código que poderia ser agrupado para tornar a lógica mais fácil de ser entendida. Transforme esse fragmento em um método cujo nome explique o propósito do mesmo.
  9. 9. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. System.out.println(“--------------------------------”); 4. System.out.println(“EXTRATO – SANTANDER”); 5. System.out.println(“--------------------------------”); 6. // imprimir detalhes 7. System.out.println(“NOME:” + nomeDoCliente); 8. for(Lancto lancto : getLanctos(periodo)) { 9. System.out.println(lancto); 10. } 11. System.out.println(“SALDO:” + saldoTotal); 12. // imprimir rodapé 13. System.out.println(“--------------------------------”); 14. System.out.println(getDataEHoraAtual()); 15. }
  10. 10. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. System.out.println(“--------------------------------”); 4. System.out.println(“EXTRATO – SANTANDER”); 5. System.out.println(“--------------------------------”); 6. // imprimir detalhes 7. System.out.println(“NOME:” + nomeDoCliente); 8. for(Lancto lancto : getLanctos(periodo)) { 9. System.out.println(lancto); 10. } 11. System.out.println(“SALDO:” + saldoTotal); 12. // imprimir rodapé 13. System.out.println(“--------------------------------”); 14. System.out.println(getDataEHoraAtual()); 15. }
  11. 11. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. 4. // imprimir detalhes 5. System.out.println(“NOME:” + nomeDoCliente); 6. for(Lancto lancto : getLanctos(periodo)) { 7. System.out.println(lancto); 8. } 9. System.out.println(“SALDO:” + saldoTotal); 10. // imprimir rodapé 11. System.out.println(“--------------------------------”); 12. System.out.println(getDataEHoraAtual()); 13. }
  12. 12. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. System.out.println(“NOME:” + nomeDoCliente); 6. for(Lancto lancto : getLanctos(periodo)) { 7. System.out.println(lancto); 8. } 9. System.out.println(“SALDO:” + saldoTotal); 10. // imprimir rodapé 11. System.out.println(“--------------------------------”); 12. System.out.println(getDataEHoraAtual()); 13. }
  13. 13. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. System.out.println(“NOME:” + nomeDoCliente); 6. for(Lancto lancto : getLanctos(periodo)) { 7. System.out.println(lancto); 8. } 9. System.out.println(“SALDO:” + saldoTotal); 10. // imprimir rodapé 11. System.out.println(“--------------------------------”); 12. System.out.println(getDataEHoraAtual()); 13. }
  14. 14. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. 6. // imprimir rodapé 7. System.out.println(“--------------------------------”); 8. System.out.println(getDataEHoraAtual()); 9. }
  15. 15. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. System.out.println(“--------------------------------”); 8. System.out.println(getDataEHoraAtual()); 9. }
  16. 16. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. System.out.println(“--------------------------------”); 8. System.out.println(getDataEHoraAtual()); 9. }
  17. 17. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. 8. }
  18. 18. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. imprimirRodape(); 8. }
  19. 19. 1. public void exibirExtrato(Periodo periodo) { 2. 3. imprimirCabecalho(); 4. 5. imprimirDetalhes(periodo); 6. 7. imprimirRodape(); 8. }
  20. 20. 1. public void exibirExtrato(Periodo periodo) { 2. imprimirCabecalho(); 3. imprimirDetalhes(periodo); 4. imprimirRodape(); 5. }
  21. 21. 1. public void exibirExtrato(Periodo periodo) { 2. imprimirCabecalho(); 3. imprimirDetalhes(periodo); 4. imprimirRodape(); 5. }
  22. 22. Atalho do Eclipse: Shift + Alt + M
  23. 23. Internalizar Método
  24. 24. O corpo do método é tão claro quanto seu nome. Coloque o corpo do método dentro do corpo do que o chama e remova o método.
  25. 25. 1. int lerAvaliacao( ) { 2. return (maisDeCincoAtrasos()) ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  26. 26. 1. int lerAvaliacao( ) { 2. return (maisDeCincoAtrasos()) ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  27. 27. 1. int lerAvaliacao( ) { 2. return () ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  28. 28. 1. int lerAvaliacao( ) { 2. return (numeroDeAtrasos > 5) ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  29. 29. 1. int lerAvaliacao( ) { 2. return (numeroDeAtrasos > 5) ? 2 : 1; 3. }
  30. 30. Atalho do Eclipse: Shift + Alt + I
  31. 31. Internalizar Variável Temporária
  32. 32. Você tem uma variável temporária que recebe uma única atribuição de uma expressão simples. Substitua todas as referências a essa variável temporária pela expressão.
  33. 33. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return preco > 1000; 4. }
  34. 34. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return preco > 1000; 4. }
  35. 35. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return > 1000; 4. }
  36. 36. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return pedido.getPreco() > 1000; 4. }
  37. 37. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return pedido.getPreco() > 1000; 4. }
  38. 38. 1. boolean produtoCaro() { 2. return pedido.getPreco() > 1000; 3. }
  39. 39. Atalho do Eclipse: Shift + Alt + I
  40. 40. Introduzir Variável Explicativa
  41. 41. Você tem uma expressão complicada. Coloque a expressão, ou partes dela, em uma variável temporária cujo único objetivo é explicar o seu propósito.
  42. 42. 1. double calculaValorDaCorrida() { 2. if (hora > 22:00 || hora < 06:00) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  43. 43. 1. double calculaValorDaCorrida() { 2. if () { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  44. 44. 1. double calculaValorDaCorrida() { 2. if (bandeiraDois) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  45. 45. 1. double calculaValorDaCorrida() { 2. boolean bandeiraDois = hora > 22:00 || hora < 06:00; 3. if (bandeiraDois) { 4. return distancia * 3.90; 5. } else { 6. return distancia * 2.10; 7. } 8. }
  46. 46. Atalho do Eclipse: Shift + Alt + L
  47. 47. Alternativa Também é interessante optar por uma extração de método para aumentar a possibilidade de reuso.
  48. 48. 1. double calculaValorDaCorrida() { 2. if (hora > 22:00 || hora < 06:00) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  49. 49. 1. double calculaValorDaCorrida() { 2. if () { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  50. 50. 1. double calculaValorDaCorrida() { 2. if (bandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  51. 51. 1. double calculaValorDaCorrida() { 2. if (bandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. } 8. boolean bandeiraDois() { 9. return hora > 22:00 || hora < 06:00; 10. }
  52. 52. Atalho do Eclipse: Shift + Alt + M
  53. 53. Dividir Variável Temporária
  54. 54. Você tem uma variável temporária que mais de uma vez, recebe uma atribuição. Crie uma variável temporária para cada atribuição.
  55. 55. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double temp = pesoDoPote / pesoDaDose; 8. temp = temp * proteinasPorDose; 9. temp = precoPote/temp; 10. return temp; 11. } 12. }
  56. 56. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double temp = pesoDoPote / pesoDaDose; 8. temp = temp * proteinasPorDose; 9. temp = precoPote/temp; 10. return temp; 11. } 12. }
  57. 57. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double = pesoDoPote / pesoDaDose; 8. temp = * proteinasPorDose; 9. temp = precoPote/temp; 10. return temp; 11. } 12. }
  58. 58. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. temp = doses * proteinasPorDose; 9. temp = precoPote/temp; 10. return temp; 11. } 12. }
  59. 59. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. temp = doses * proteinasPorDose; 9. temp = precoPote/temp; 10. return temp; 11. } 12. }
  60. 60. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. = doses * proteinasPorDose; 9. temp = precoPote/; 10. return temp; 11. } 12. }
  61. 61. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. double proteinas = doses * proteinasPorDose; 9. temp = precoPote/proteinas; 10. return temp; 11. } 12. }
  62. 62. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. double proteinas = doses * proteinasPorDose; 9. temp = precoPote/proteinas; 10. return temp; 11. } 12. }
  63. 63. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. double proteinas = doses * proteinasPorDose; 9. = precoPote/proteinas; 10. return; 11. } 12. }
  64. 64. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. double proteinas = doses * proteinasPorDose; 9. double precoPorProteina = precoPote/proteinas; 10. return precoPorProteina; 11. } 12. }
  65. 65. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. return getDoses()/getTotalProteinas(); 8. }
  66. 66. Atalho do Eclipse: Shift + Alt + R
  67. 67. Remover Atribuições a Parâmetros
  68. 68. O código faz atribuições a parâmetros. Utilize uma variável temporária no lugar da atribuição
  69. 69. 1. void desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  70. 70. 1. void desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  71. 71. 1. desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  72. 72. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  73. 73. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. 4. } 5. }
  74. 74. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. }
  75. 75. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. 6. }
  76. 76. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. return 0.0; 6. }
  77. 77. Substituir Números Mágicos por Constantes
  78. 78. Você tem um número literal com um significado especial. Crie uma constante, nomeie-a de acordo com seu significado e substitua o número por ela.
  79. 79. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * 9.81 * altura; 5. } 6. 7. }
  80. 80. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * 9.81 * altura; 5. } 6. 7. }
  81. 81. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * * altura; 5. } 6. 7. }
  82. 82. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * GRAVIDADE * altura; 5. } 6. 7. }
  83. 83. 1. public class Fisica { 2. public static final double GRAVIDADE = 9.81; 3. double energiaPotencial(double massa, double altura) { 4. return massa * GRAVIDADE * altura; 5. } 6. 7. }
  84. 84. Eclipse: Ctrl + 3, Extract Constant
  85. 85. Renomear Método
  86. 86. O nome de um método não está revelando seu propósito. Altere o nome do método.
  87. 87. 1. public void processar() { 2. // Código para processar 3. }
  88. 88. 1. public void () { 2. // Código para processar 3. }
  89. 89. 1. public void processarFolhaDePagamento() { 2. // Código para processar folha de pagamento 3. }
  90. 90. Preservar o Objeto Inteiro
  91. 91. Você está lendo diverso valores de um objeto e passando esses valores como parâmetros em uma chamada de método. Em vez de fazer isso, envie o objeto inteiro.
  92. 92. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(nota1, nota2, nota3, nota4); 8. } 9. }
  93. 93. E se houver uma modificação que solicita a inclusão de mais uma nota?
  94. 94. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(nota1, nota2, nota3, nota4); 8. } 9. }
  95. 95. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. int nota5 = notasParciais.getNota5(); 8. double media = calcularMedia(nota1, nota2, nota3, nota4, nota5); 9. } 10. }
  96. 96. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. int nota5 = notasParciais.getNota5(); 8. int nota6 = notasParciais.getNota6(); 9. double media = calcularMedia(nota1, nota2, nota3, nota4, nota5, nota6); 10. } 11. }
  97. 97. A tendência é o método crescer...
  98. 98. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(nota1, nota2, nota3, nota4); 8. } 9. }
  99. 99. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(); 8. } 9. }
  100. 100. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(notasParciais); 8. } 9. }
  101. 101. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(notasParciais); 8. } 9. }
  102. 102. 1. public class Boletim { 2. public void renderizarMedia() { 3. double media = calcularMedia(notasParciais); 4. } 5. }
  103. 103. 1. public class Boletim { 2. public void renderizarMedia() { 3. double media = calcularMedia(notasParciais); 4. } 5. }
  104. 104. Cuidado com o HttpServletRequest
  105. 105. Atalho do Eclipse: Shift + Alt + R
  106. 106. Substituir Algoritmo
  107. 107. Você tem um algoritmo confuso e as refatorações não estão ajudando. Substitua o corpo do método por um novo algoritmo.
  108. 108. Simplificando Expressões Condicionais
  109. 109. Decompor Condicional
  110. 110. Você tem uma estrutura condicional complicada. Extraia métodos para a condição, para a parte após o then e para a parte após o else.
  111. 111. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  112. 112. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  113. 113. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. 4. } else { 5. return distancia * 2.10; 6. } 7. }
  114. 114. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. return distancia * 2.10; 6. } 7. }
  115. 115. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. return distancia * 2.10; 6. } 7. }
  116. 116. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. 6. } 7. }
  117. 117. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. return calcularBandeiraUm(distancia); 6. } 7. }
  118. 118. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. return calcularBandeiraUm(distancia); 6. } 7. }
  119. 119. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } 5. return calcularBandeiraUm(distancia); 6. }
  120. 120. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } 5. return calcularBandeiraUm(distancia); 6. }
  121. 121. Atalho do Eclipse: Shift + Alt + M
  122. 122. Consolidar Expressão Condicional
  123. 123. Você tem uma sequência de testes com o mesmo resultado. Consolide-os em uma única expressão e extraia-a.
  124. 124. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. if (temCarteirinha) { 4. if (naoEhFalsa) { 5. return valor * 0.5; 6. } 7. } 8. } 9. return valor; 10. }
  125. 125. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. if (temCarteirinha) { 4. 5. return valor * 0.5; 6. 7. } 8. } 9. return valor; 10. }
  126. 126. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. if (temCarteirinha && naoEhFalsa) { 4. 5. return valor * 0.5; 6. 7. } 8. } 9. return valor; 10. }
  127. 127. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. if (temCarteirinha && naoEhFalsa) { 4. return valor * 0.5; 5. } 6. } 7. return valor; 8. }
  128. 128. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. if (temCarteirinha && naoEhFalsa) { 4. return valor * 0.5; 5. } 6. } 7. return valor; 8. }
  129. 129. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. 4. return valor * 0.5; 5. 6. } 7. return valor; 8. }
  130. 130. 1. int calcularEntrada(int valor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. 4. return valor * 0.5; 5. 6. } 7. return valor; 8. }
  131. 131. 1. int calcularEntrada(int valor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  132. 132. 1. int calcularEntrada(int valor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  133. 133. 1. int calcularEntrada(int valor) { 2. if () { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  134. 134. 1. int calcularEntrada(int valor) { 2. if (aptoAPagarMeiaEntrada()) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  135. 135. 1. int calcularEntrada(int valor) { 2. if (aptoAPagarMeiaEntrada()) { 3. return valor * 0.5; 4. } 5. return valor; 6. } 7. 8. boolean aptoAPagarMeiaEntrada() { 9. return estudante && temCarteirinha && naoEhFalsa; 10. }
  136. 136. 1. int calcularEntrada(int valor) { 2. if (aptoAPagarMeiaEntrada()) return valor * 0.5; 3. return valor; 4. } 5. 6. boolean aptoAPagarMeiaEntrada() { 7. return estudante && temCarteirinha && naoEhFalsa; 8. }
  137. 137. Consolidar Fragmentos Condicionais Duplicados
  138. 138. O mesmo fragmento de código aparece duplicado em todos os remos de uma expressão condicional. Mova-os para fora da expressão.
  139. 139. 1. public void sendRequest(Object data) { 2. if (data == null) { 3. resource.send(); 4. } else { 5. resource.setData(data); 6. resource.send(); 7. } 8. }
  140. 140. 1. public void sendRequest(Object data) { 2. if (data == null) { 3. resource.send(); 4. } else { 5. resource.setData(data); 6. resource.send(); 7. } 8. }
  141. 141. 1. public void sendRequest(Object data) { 2. if (data == null) { 3. } else { 4. resource.setData(data); 5. } 6. }
  142. 142. 1. public void sendRequest(Object data) { 2. if (data == null) { 3. } else { 4. resource.setData(data); 5. } 6. resource.send(); 7. }
  143. 143. 1. public void sendRequest(Object data) { 2. if (data != null) { 3. } else { 4. resource.setData(data); 5. } 6. resource.send(); 7. }
  144. 144. 1. public void sendRequest(Object data) { 2. if (data != null) { 3. resource.setData(data); 4. } 5. resource.send(); 6. }
  145. 145. 1. public void sendRequest(Object data) { 2. if (data != null) resource.setData(data); 3. resource.send(); 4. }
  146. 146. Remover Condição Aninhada por Cláusulas Guarda
  147. 147. Um método tem lógica condicional que não deixa claro o fluxo normal da execução. Use cláusulas-guarda para todos os casos especiais.
  148. 148. 1. public boolean fecharCaixa() { 2. if(!caixaFechado) { 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. } else { 13. return true; 14. } 15. }
  149. 149. 1. public boolean fecharCaixa() { 2. if(!caixaFechado) { 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. } else { 13. return true; 14. } 15. }
  150. 150. 1. public boolean fecharCaixa() { 2. if(!caixaFechado) { 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. }
  151. 151. 1. public boolean fecharCaixa() { 2. if(!caixaFechado) { 3. 4. } 5. if(saldo > 0) { 6. if (dataDeAberturaDoCaixa.equals(hoje)) { 7. transferirDinheiroParaContaBancaria(saldo); 8. } else { 9. throw new DataRetroativaException(); 10. } 11. } else { 12. throw new SaldoNegativoException(); 13. } 14. }
  152. 152. 1. public boolean fecharCaixa() { 2. if(caixaFechado) { 3. 4. } 5. if(saldo > 0) { 6. if (dataDeAberturaDoCaixa.equals(hoje)) { 7. transferirDinheiroParaContaBancaria(saldo); 8. } else { 9. throw new DataRetroativaException(); 10. } 11. } else { 12. throw new SaldoNegativoException(); 13. } 14. }
  153. 153. 1. public boolean fecharCaixa() { 2. if(caixaFechado) { 3. return true; 4. } 5. if(saldo > 0) { 6. if (dataDeAberturaDoCaixa.equals(hoje)) { 7. transferirDinheiroParaContaBancaria(saldo); 8. } else { 9. throw new DataRetroativaException(); 10. } 11. } else { 12. throw new SaldoNegativoException(); 13. } 14. }
  154. 154. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. }
  155. 155. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. }
  156. 156. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. }
  157. 157. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. }
  158. 158. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. }
  159. 159. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. } 5. if (dataDeAberturaDoCaixa.equals(hoje)) { 6. transferirDinheiroParaContaBancaria(saldo); 7. } else { 8. throw new DataRetroativaException(); 9. } 10. }
  160. 160. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) { 4. } 5. if (dataDeAberturaDoCaixa.equals(hoje)) { 6. transferirDinheiroParaContaBancaria(saldo); 7. } else { 8. throw new DataRetroativaException(); 9. } 10. }
  161. 161. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) { 4. throw new SaldoNegativoException(); 5. } 6. if (dataDeAberturaDoCaixa.equals(hoje)) { 7. transferirDinheiroParaContaBancaria(saldo); 8. } else { 9. throw new DataRetroativaException(); 10. } 11. }
  162. 162. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. }
  163. 163. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. }
  164. 164. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. }
  165. 165. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. }
  166. 166. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. }
  167. 167. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. } 6. transferirDinheiroParaContaBancaria(saldo); 7. }
  168. 168. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (!dataDeAberturaDoCaixa.equals(hoje)) { 5. } 6. transferirDinheiroParaContaBancaria(saldo); 7. }
  169. 169. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (!dataDeAberturaDoCaixa.equals(hoje)) { 5. throw new DataRetroativaException(); 6. } 7. transferirDinheiroParaContaBancaria(saldo); 8. }
  170. 170. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if () { 5. throw new DataRetroativaException(); 6. } 7. transferirDinheiroParaContaBancaria(saldo); 8. }
  171. 171. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataRetroativa) { 5. throw new DataRetroativaException(); 6. } 7. transferirDinheiroParaContaBancaria(saldo); 8. }
  172. 172. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataRetroativa) throw new DataRetroativaException(); 5. transferirDinheiroParaContaBancaria(saldo); 6. }
  173. 173. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataRetroativa) throw new DataRetroativaException(); 5. transferirDinheiroParaContaBancaria(saldo); 6. }
  174. 174. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataRetroativa) throw new DataRetroativaException(); 5. transferirDinheiroParaContaBancaria(saldo); 6. }
  175. 175. Substituir Comando Condicional por Polimorfismo
  176. 176. Você tem um comando condicional que seleciona diferentes comportamentos de acordo com o tipo de objeto. Mova cada ramificação do comando condicional para um método de sobrescrita em uma subclasse. Torne abstrato o método original.
  177. 177. 1. public void emitirExtrato(String tipo) { 2. if(tipo.equals(“SimplificadoMensal”)) { 3. // Código para emissão do extrato simplificado mensal. 4. } else if(tipo.equals(“SimplificadoQuinzenal”)) { 5. // Código para emissão do extrato simplificado quinzenal. 6. } else if(tipo.equals(“SimplificadoSemanal”)) { 7. // Código para emissão do extrato simplificado semanal. 8. } else if(tipo.equals(“Completo”)) { 9. // Código para emissão do extrato completo. 10. } 11. }
  178. 178. E se houver um novo tipo de extrato?
  179. 179. 1. public void emitirExtrato(String tipo) { 2. if(tipo.equals(“SimplificadoMensal”)) { 3. // Código para emissão do extrato simplificado mensal. 4. } else if(tipo.equals(“SimplificadoQuinzenal”)) { 5. // Código para emissão do extrato simplificado quinzenal. 6. } else if(tipo.equals(“SimplificadoSemanal”)) { 7. // Código para emissão do extrato simplificado semanal. 8. } else if(tipo.equals(“Completo”)) { 9. // Código para emissão do extrato completo. 10. } 11. }
  180. 180. 1. public void emitirExtrato(String tipo) { 2. if(tipo.equals(“SimplificadoMensal”)) { 3. // Código para emissão do extrato simplificado mensal. 4. } else if(tipo.equals(“SimplificadoQuinzenal”)) { 5. // Código para emissão do extrato simplificado quinzenal. 6. } else if(tipo.equals(“SimplificadoSemanal”)) { 7. // Código para emissão do extrato simplificado semanal. 8. } else if(tipo.equals(“Completo”)) { 9. // Código para emissão do extrato completo. 10. } else if(tipo.equals(“CompletoTrimestral”)) { 11. // Código para emissão do extrato completo trimestral. 12. } 13. }
  181. 181. 1. public void emitirExtrato(String tipo) { 2. if(tipo.equals(“SimplificadoMensal”)) { 3. // Código para emissão do extrato simplificado mensal. 4. } else if(tipo.equals(“SimplificadoQuinzenal”)) { 5. // Código para emissão do extrato simplificado quinzenal. 6. } else if(tipo.equals(“SimplificadoSemanal”)) { 7. // Código para emissão do extrato simplificado semanal. 8. } else if(tipo.equals(“Completo”)) { 9. // Código para emissão do extrato completo. 10. } else if(tipo.equals(“CompletoTrimestral”)) { 11. // Código para emissão do extrato completo trimestral. 12. } else if(tipo.equals(“CompletoAnual”)) { 13. // Código para emissão do extrato completo anual. 14. } 15. }
  182. 182. Este método tende ao infinito...
  183. 183. 1. public void emitirExtrato(String tipo) { 2. if(tipo.equals(“SimplificadoMensal”)) { 3. // Código para emissão do extrato simplificado mensal. 4. } else if(tipo.equals(“SimplificadoQuinzenal”)) { 5. // Código para emissão do extrato simplificado quinzenal. 6. } else if(tipo.equals(“SimplificadoSemanal”)) { 7. // Código para emissão do extrato simplificado semanal. 8. } else if(tipo.equals(“Completo”)) { 9. // Código para emissão do extrato completo. 10. } 11. }
  184. 184. 1. public abstract class Extrato { 2. public abstract void emitir(); 3. } 4. 5. public class ExtratoSimplificadoMensal extends Extrato { 6. public void emitir() { 7. // Código para emissão do extrato simplificado mensal. 8. } 9. } 10. 11. public class ExtratoCompleto extends Extrato { 12. public void emitir() { 13. // Código para emissão do extrato completo. 14. } 15. }
  185. 185. 1. public void emitirExtrato(String tipo) { 2. Extrato.criarExtrato(tipo).emitir(); 3. }
  186. 186. Introduzir Comando Ternário
  187. 187. Você tem um if apenas para decidir qual atribuição realizar. Utilize um comando ternário.
  188. 188. (expressão condicional) ? true : false;
  189. 189. 1. public void calcularImposto(int valor) { 2. int imposto = 0; 3. if (valor > 1000) { 4. imposto = valor * 0.05; 5. } else { 6. imposto = valor * 0.02; 7. } 8. return imposto; 9. }
  190. 190. 1. public void calcularImposto(int valor) { 2. int imposto = 0; 3. if (valor > 1000) { 4. imposto = valor * 0.05; 5. } else { 6. imposto = valor * 0.02; 7. } 8. return imposto; 9. }
  191. 191. 1. public void calcularImposto(int valor) { 2. int imposto = 3. return imposto; 4. }
  192. 192. 1. public void calcularImposto(int valor) { 2. int imposto = (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. return imposto; 4. }
  193. 193. 1. public void calcularImposto(int valor) { 2. int imposto = (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. return imposto; 4. }
  194. 194. 1. public void calcularImposto(int valor) { 2. return (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. }
  195. 195. Remover Comando Ternário
  196. 196. Você tem um ternário aninhado que se tornou complexo de entender. Mude o ternário para um if.
  197. 197. 1. public void calcularImposto(int valor) { 2. return (valor > 1000) ? (valor < 10000) ? valor * 0.05 : valor * 0.10 : valor * 0.02; 3. }
  198. 198. Refatorando Classes
  199. 199. Extrair Classe
  200. 200. Você tem uma classe, perdendo coesão, fazendo um trabalho que poderia ser feito por duas ou mais classes. Crie uma nova classe e mova os campos e métodos pertinentes.
  201. 201. 1. public class Security { 2. private static final String RULES_PATH = “/usr/rules.xml”; 3. 4. public Security() { 5. this.loadRules(RULES_PATH); 6. } 7. 8. private void loadRules(String rulesPath) { 9. // Código que carrega as regras. 10. } 11. 12. public boolean verifyUser(User user) { 13. // Código que valida o usuário. 14. } 15. }
  202. 202. 1. public class Security { 2. private static final String RULES_PATH = “/usr/rules.xml”; 3. 4. public Security() { 5. this.loadRules(RULES_PATH); 6. } 7. 8. private void loadRules(String rulesPath) { 9. // Código que carrega as regras. 10. } 11. 12. public boolean verifyUser(User user) { 13. // Código que valida o usuário. 14. } 15. }
  203. 203. 1. public class Security { 2. 3. public Security() { 4. } 5. 6. public boolean verifyUser(User user) { 7. // Código que valida o usuário. 8. } 9. }
  204. 204. 1. public class Security { 2. 3. public Security() { 4. 5. } 6. 7. public boolean verifyUser(User user) { 8. // Código que valida o usuário. 9. } 10. }
  205. 205. 1. public class Security { 2. 3. public Security() { 4. SecurityRulesLoader.loadRules(); 5. } 6. 7. public boolean verifyUser(User user) { 8. // Código que valida o usuário. 9. } 10. }
  206. 206. 1. public class SecurityRulesLoader { 2. private static final String RULES_PATH = “/usr/rules.xml”; 3. 4. public static void loadRules() { 5. // Código que carrega as regras. 6. } 7. 8. }
  207. 207. Ocultar Delegação
  208. 208. Uma classe referencia uma outra classe delegada por um objeto. Crie métodos no servidor para ocultar a delegação.
  209. 209. 1. // Código da classe PaperBoy… 2. double valorAPagar = 2.00; 3. if (cliente.getCarteira().getTotal() > valorAPagar) { 4. cliente.getCarteira().retirarDinheiro(valorAPagar); 5. } else { 6. // Volte quando tiver dinheiro para pagar… 7. }
  210. 210. 1. // Código da classe PaperBoy… 2. double valorAPagar = 2.00; 3. if (cliente.getCarteira().getTotal() > valorAPagar) { 4. cliente.getCarteira().retirarDinheiro(valorAPagar); 5. } else { 6. // Volte quando tiver dinheiro para pagar… 7. }
  211. 211. 1. // Código da classe PaperBoy… 2. double valorAPagar = 2.00; 3. if () { 4. 5. } else { 6. // Volte quando tiver dinheiro para pagar… 7. }
  212. 212. 1. // Código da classe PaperBoy… 2. double valorAPagar = 2.00; 3. if (cliente.pagar(valorAPagar)) { 4. // Agradecemos a preferência… 5. } else { 6. // Volte quando tiver dinheiro para pagar… 7. }
  213. 213. Substituindo Construtor por Método Fábrica
  214. 214. Você tem muitos construtores que fazem coisas diferentes. Utilize métodos fábrica para tornar a construção mais intuitiva.
  215. 215. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public Triangulo(int tamanho) { 6. this.lado1 = tamanho; 7. this.lado2 = tamanho; 8. this.lado3 = tamanho; 9. } 10. public Triangulo(int tamanho1, int tamanho2) { 11. this.lado1 = tamanho1; 12. this.lado2 = tamanho2; 13. this.lado3 = tamanho2; 14. } 15. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 16. this.lado1 = tamanho1; 17. this.lado2 = tamanho2; 18. this.lado3 = tamanho3; 19. } 20. }
  216. 216. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public Triangulo(int tamanho) { 6. this.lado1 = tamanho; 7. this.lado2 = tamanho; 8. this.lado3 = tamanho; 9. } 10. public Triangulo(int tamanho1, int tamanho2) { 11. this.lado1 = tamanho1; 12. this.lado2 = tamanho2; 13. this.lado3 = tamanho3; 14. } 15. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 16. this.lado1 = tamanho1; 17. this.lado2 = tamanho2; 18. this.lado3 = tamanho3; 19. } 20. }
  217. 217. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public Triangulo(int tamanho) { 6. } 7. public Triangulo(int tamanho1, int tamanho2) { 8. this.lado1 = tamanho1; 9. this.lado2 = tamanho2; 10. this.lado3 = tamanho3; 11. } 12. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 13. this.lado1 = tamanho1; 14. this.lado2 = tamanho2; 15. this.lado3 = tamanho3; 16. } 17. }
  218. 218. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public Triangulo(int tamanho) { 6. this(tamanho, tamanho, tamanho); 7. } 8. public Triangulo(int tamanho1, int tamanho2) { 9. this.lado1 = tamanho1; 10. this.lado2 = tamanho2; 11. this.lado3 = tamanho3; 12. } 13. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 14. this.lado1 = tamanho1; 15. this.lado2 = tamanho2; 16. this.lado3 = tamanho3; 17. } 18. }
  219. 219. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public Triangulo(int tamanho) { 6. this(tamanho, tamanho, tamanho); 7. } 8. public Triangulo(int tamanho1, int tamanho2) { 9. } 10. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 11. this.lado1 = tamanho1; 12. this.lado2 = tamanho2; 13. this.lado3 = tamanho3; 14. } 15. }
  220. 220. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public Triangulo(int tamanho) { 6. this(tamanho, tamanho, tamanho); 7. } 8. public Triangulo(int tamanho1, int tamanho2) { 9. this(tamanho1, tamanho2, tamanho2); 10. } 11. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 12. this.lado1 = tamanho1; 13. this.lado2 = tamanho2; 14. this.lado3 = tamanho3; 15. } 16. }
  221. 221. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public (int tamanho) { 6. this(tamanho, tamanho, tamanho); 7. } 8. public Triangulo(int tamanho1, int tamanho2) { 9. this(tamanho1, tamanho2, tamanho2); 10. } 11. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 12. this.lado1 = tamanho1; 13. this.lado2 = tamanho2; 14. this.lado3 = tamanho3; 15. } 16. }
  222. 222. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. this(tamanho, tamanho, tamanho); 7. } 8. public Triangulo(int tamanho1, int tamanho2) { 9. this(tamanho1, tamanho2, tamanho2); 10. } 11. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 12. this.lado1 = tamanho1; 13. this.lado2 = tamanho2; 14. this.lado3 = tamanho3; 15. } 16. }
  223. 223. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. (tamanho, tamanho, tamanho); 7. } 8. public Triangulo(int tamanho1, int tamanho2) { 9. this(tamanho1, tamanho2, tamanho2); 10. } 11. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 12. this.lado1 = tamanho1; 13. this.lado2 = tamanho2; 14. this.lado3 = tamanho3; 15. } 16. }
  224. 224. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public Triangulo(int tamanho1, int tamanho2) { 9. this(tamanho1, tamanho2, tamanho2); 10. } 11. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 12. this.lado1 = tamanho1; 13. this.lado2 = tamanho2; 14. this.lado3 = tamanho3; 15. } 16. }
  225. 225. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public (int tamanho1, int tamanho2) { 9. this(tamanho1, tamanho2, tamanho2); 10. } 11. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 12. this.lado1 = tamanho1; 13. this.lado2 = tamanho2; 14. this.lado3 = tamanho3; 15. } 16. }
  226. 226. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. this(tamanho1, tamanho2, tamanho2); 10. } 11. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 12. this.lado1 = tamanho1; 13. this.lado2 = tamanho2; 14. this.lado3 = tamanho3; 15. } 16. }
  227. 227. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. (tamanho1, tamanho2, tamanho2); 10. } 11. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 12. this.lado1 = tamanho1; 13. this.lado2 = tamanho2; 14. this.lado3 = tamanho3; 15. } 16. }
  228. 228. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. return new Triangulo(tamanho1, tamanho2, tamanho2); 10. } 11. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 12. this.lado1 = tamanho1; 13. this.lado2 = tamanho2; 14. this.lado3 = tamanho3; 15. } 16. }
  229. 229. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. return new Triangulo(tamanho1, tamanho2, tamanho2); 10. } 11. public static criarTrianguloEscaleno(int tamanho1, int tamanho2, int tamanho3) { 12. return new Triangulo(tamanho1, tamanho2, tamanho3); 13. } 14. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 15. this.lado1 = tamanho1; 16. this.lado2 = tamanho2; 17. this.lado3 = tamanho3; 18. } 19. }
  230. 230. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. return new Triangulo(tamanho1, tamanho2, tamanho2); 10. } 11. public static criarTrianguloEscaleno(int tamanho1, int tamanho2, int tamanho3) { 12. return new Triangulo(tamanho1, tamanho2, tamanho3); 13. } 14. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 15. this.lado1 = tamanho1; 16. this.lado2 = tamanho2; 17. this.lado3 = tamanho3; 18. } 19. }
  231. 231. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. return new Triangulo(tamanho1, tamanho2, tamanho2); 10. } 11. public static criarTrianguloEscaleno(int tamanho1, int tamanho2, int tamanho3) { 12. return new Triangulo(tamanho1, tamanho2, tamanho3); 13. } 14. Triangulo(int tamanho1, int tamanho2, int tamanho3) { 15. this.lado1 = tamanho1; 16. this.lado2 = tamanho2; 17. this.lado3 = tamanho3; 18. } 19. }
  232. 232. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static Triangulo criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. return new Triangulo(tamanho1, tamanho2, tamanho2); 10. } 11. public static criarTrianguloEscaleno(int tamanho1, int tamanho2, int tamanho3) { 12. return new Triangulo(tamanho1, tamanho2, tamanho3); 13. } 14. private Triangulo(int tamanho1, int tamanho2, int tamanho3) { 15. this.lado1 = tamanho1; 16. this.lado2 = tamanho2; 17. this.lado3 = tamanho3; 18. } 19. }
  233. 233. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. return new Triangulo(tamanho1, tamanho2, tamanho2); 10. } 11. public static criarTrianguloEscaleno(int tamanho1, int tamanho2, int tamanho3) { 12. return new Triangulo(tamanho1, tamanho2, tamanho3); 13. } 14. private Triangulo(int tamanho1, int tamanho2, int tamanho3) { 15. this.lado1 = tamanho1; 16. this.lado2 = tamanho2; 17. this.lado3 = tamanho3; 18. } 19. }
  234. 234. Criar um Template Method
  235. 235. Você tem dois métodos em subclasses diferentes que executam passos semelhantes na mesma ordem, mas esses passos são diferentes. Utilize um Template Method para eliminar a duplicação.
  236. 236. 1. public class Cafe { 2. public void fazerCafe() { 3. ferverAgua(); 4. passarCafe(); 5. colocarNaXicara(); 6. colocarAcucar(); 7. } 8. public void ferverAgua() { 9. System.out.println(“Fervendo a água...”); 10. } 11. public void passarCafe() { 12. System.out.println(“Passando o café...”); 13. } 14. public void colocaNaXicara() { 15. System.out.println(“Colocando na xícara...”); 16. } 17. public void colocarAcucar() { 18. System.out.println(“Colocando açucar...”); 19. } 20. }
  237. 237. 1. public class Cha { 2. public void fazerCha() { 3. ferverAgua(); 4. mergulharCha(); 5. colocarNaXicara(); 6. colocarLimao(); 7. } 8. public void ferverAgua() { 9. System.out.println(“Fervendo a água...”); 10. } 11. public void mergulharCha() { 12. System.out.println(“Mergulhando o chá...”); 13. } 14. public void colocaNaXicara() { 15. System.out.println(“Colocando na xícara...”); 16. } 17. public void colocarLimao() { 18. System.out.println(“Colocando limão...”); 19. } 20. }
  238. 238. 1. public class Cafe { 2. public void fazerCafe() { 3. ferverAgua(); 4. passarCafe(); 5. colocarNaXicara(); 6. colocarAcucar(); 7. } 8. public void ferverAgua() { 9. System.out.println(“Fervendo a água...”); 10. } 11. public void passarCafe() { 12. System.out.println(“Passando o café...”); 13. } 14. public void colocaNaXicara() { 15. System.out.println(“Colocando na xícara...”); 16. } 17. public void colocarAcucar() { 18. System.out.println(“Colocando açucar...”); 19. } 20. }
  239. 239. 1. public class Cha { 2. public void fazerCha() { 3. ferverAgua(); 4. mergulharCha(); 5. colocarNaXicara(); 6. colocarLimao(); 7. } 8. public void ferverAgua() { 9. System.out.println(“Fervendo a água...”); 10. } 11. public void mergulharCha() { 12. System.out.println(“Mergulhando o chá...”); 13. } 14. public void colocaNaXicara() { 15. System.out.println(“Colocando na xícara...”); 16. } 17. public void colocarLimao() { 18. System.out.println(“Colocando limão...”); 19. } 20. }
  240. 240. 1. public abstract class BebidaQuente { 2. public void prepararBebida() { 3. ferverAgua(); 4. infusao(); 5. colocarNaXicara(); 6. condimentar(); 7. } 8. public void ferverAgua() { 9. System.out.println(“Fervendo a água...”); 10. } 11. public abstract void infusao(); 12. public void colocaNaXicara() { 13. System.out.println(“Colocando na xícara...”); 14. } 15. public abstract void condimentar(); 16. }
  241. 241. 1. public class Café extends BebidaQuente { 2. public void infusao() { 3. System.out.println(“Passando o café...”); 4. } 5. public void condimentar() { 6. System.out.println(“Colocando açucar...”); 7. } 8. }
  242. 242. 1. public class Cha extends BebidaQuente { 2. public void infusao() { 3. System.out.println(“Mergulhando o chá...”); 4. } 5. public void condimentar() { 6. System.out.println(“Colocando limão...”); 7. } 8. }
  243. 243. Criar um Strategy Enum
  244. 244. Você tem um switch ou aninhamento de condicional e não quer criar um conjunto de classes. Utilize um enum com strategy para absorver o polimorfismo.
  245. 245. 1. public class Banco { 2. 3. public void emitirExtrato(String tipo) { 4. if(tipo.equals(“SimplificadoMensal”)) { 5. // Código para emissão do extrato simplificado mensal. 6. } else if(tipo.equals(“SimplificadoQuinzenal”)) { 7. // Código para emissão do extrato simplificado quinzenal. 8. } else if(tipo.equals(“SimplificadoSemanal”)) { 9. // Código para emissão do extrato simplificado semanal. 10. } else if(tipo.equals(“Completo”)) { 11. // Código para emissão do extrato completo. 12. } 13. } 14. 15. }
  246. 246. 1. public enum TipoExtrato { 2. SimplificadoMensal, 3. SimplificadoQuinzenal, 4. SimplificadoSemanal, 5. Completo; 6. }
  247. 247. 1. public enum TipoExtrato { 2. SimplificadoMensal, 3. SimplificadoQuinzenal, 4. SimplificadoSemanal, 5. Completo; 6. 7. public abstract void emitirExtrato(); 8. }
  248. 248. 1. public enum TipoExtrato { 2. SimplificadoMensal { 3. public void emitirExtrato() { 4. // Código da emissão do extrato. 5. } 6. }, 7. SimplificadoQuinzenal, 8. SimplificadoSemanal, 9. Completo; 10. 11. public abstract void emitirExtrato(); 12. }
  249. 249. 1. public class Banco { 2. 3. public void emitirExtrato(String tipo) { 4. if(tipo.equals(“SimplificadoMensal”)) { 5. // Código para emissão do extrato simplificado mensal. 6. } else if(tipo.equals(“SimplificadoQuinzenal”)) { 7. // Código para emissão do extrato simplificado quinzenal. 8. } else if(tipo.equals(“SimplificadoSemanal”)) { 9. // Código para emissão do extrato simplificado semanal. 10. } else if(tipo.equals(“Completo”)) { 11. // Código para emissão do extrato completo. 12. } 13. } 14. 15. }
  250. 250. 1. public class Banco { 2. 3. public void emitirExtrato(String tipo) { 4. } 5. 6. }
  251. 251. 1. public class Banco { 2. 3. public void emitirExtrato(String tipo) { 4. TipoExtrato.valueOf(tipo).emitir(); 5. } 6. 7. }
  252. 252. Substituindo Construtores por Fluent Interface
  253. 253. Você tem construtores que recebem muitos parâmetros e alguns deles são opcionais. Utilize uma Fluent Interface para flexibilizar a criação dos objetos.
  254. 254. 1. new EmailMessage() 2. .from(“rodrigo.branas@gmail.com”) 3. .to(“contato@globo.com”) 4. .withSubject(“Fluent API - Demo”) 5. .withMessage(“Message…”) 6. .send();
  255. 255. 1. Date data = november(20, 2005);
  256. 256. 1. new Image(“cat.jpg”) 2. .rotate(90) 3. .watermark(“Copyright - 2012”) 4. .blackAndWhite() 5. .save(“catAfterChanges.jpg”);
  257. 257. Encapsular Coleção
  258. 258. Um método retorna uma coleção. Faça-o retornar uma visão apenas de leitura e forneça métodos de adição e remoção.
  259. 259. 1. ... 2. Biblioteca biblioteca = new Biblioteca(); 3. 4. Set<Livro> livros = new HashSet<Livro>(); 5. livros.add(new Livro(“Refactoring”); 6. livros.add(new Livro(“Clean Code”); 7. livros.add(new Livro(“Effective Java”); 8. livros.add(new Livro(“Design Patterns”); 9. 10. biblioteca.setLivros(livros); 11. ...
  260. 260. 1. public class Biblioteca { 2. 3. private Set<Livro> livros; 4. 5. public Set<Livro> getLivros() { 6. return livros; 7. } 8. 9. public void setLivros(Set<Livro> livros) { 10. this.livros = livros; 11. } 12. }
  261. 261. 1. public class Biblioteca { 2. 3. private Set<Livro> livros; 4. 5. public Set<Livro> getLivros() { 6. return livros; 7. } 8. 9. public void setLivros(Set<Livro> livros) { 10. this.livros = livros; 11. } 12. }
  262. 262. 1. public class Biblioteca { 2. 3. private Set<Livro> livros; 4. 5. }
  263. 263. 1. public class Biblioteca { 2. 3. private Set<Livro> livros; 4. 5. public void adicionarLivro(Livro livro) { 6. this.livros.add(livro); 7. } 8. 9. public void removerLivro(Livro livro) { 10. this.livros.remove(livro); 11. }
  264. 264. 1. ... 2. Biblioteca biblioteca = new Biblioteca(); 3. 4. biblioteca.adicionarLivro(new Livro(“Refactoring”)); 5. biblioteca.adicionarLivro(new Livro(“Clean Code”); 6. biblioteca.adicionarLivro(new Livro(“Effective Java”); 7. biblioteca.adicionarLivro(new Livro(“Design Patterns”); 8. ...
  265. 265. Lidando com exceções
  266. 266. Evite lançar exceções genéricas
  267. 267. Você está lançando uma exceção genérica Tente lançar exceções específicas
  268. 268. 1. public void calcularImposto(int salario) throws Exception { 2. if(salario < 0) { 3. throw new Exception(“Salário não pode ser negativo”); 4. } 5. // Código de cálculo do imposto retido na fonte 6. }
  269. 269. 1. public void calcularImposto(int salario) throws Exception { 2. if(salario < 0) { 3. throw new Exception(“Salário não pode ser negativo”); 4. } 5. // Código de cálculo do imposto retido na fonte 6. }
  270. 270. 1. public void calcularImposto(int salario) { 2. if(salario < 0) { 3. throw new (“Salário não pode ser negativo”); 4. } 5. // Código de cálculo do imposto retido na fonte 6. }
  271. 271. 1. public void calcularImposto(int salario) { 2. if(salario < 0) { 3. throw new IllegalArgumentException(“Salário não pode ser negativo”); 4. } 5. // Código de cálculo do imposto retido na fonte 6. }
  272. 272. Evite tratar exceções de forma genérica
  273. 273. Você possui um bloco catch tratando exceções genéricas Utilize exceções específicas
  274. 274. 1. try { 2. // Código que lança a exceção. 3. } catch (Exception e) { 4. // Código de tratamento da exceção 5. }
  275. 275. 1. try { 2. // Código que lança a exceção. 3. } catch (Throwable e) { 4. // Código de tratamento da exceção 5. }
  276. 276. Não ignore exceções
  277. 277. Você possui um bloco catch vazio Avalie se faz sentido continuar utilizando uma exceção verificada (checked)
  278. 278. 1. try { 2. // Código que lança a exceção. 3. } catch (SomeException e) { 4. // ??? 5. }
  279. 279. 1. try { 2. // Código que lança a exceção. 3. } catch (SomeException e) { 4. 5. }
  280. 280. 1. try { 2. // Código que lança a exceção. 3. } catch (SomeException e) { 4. e.printStacktrace(); 5. }
  281. 281. Exceção lançada sem informações de captura
  282. 282. Existem exceções sendo lançadas sem uma mensagem contendo a explicação detalhada da falha Define uma mensagem detalhando a falha
  283. 283. 1. public void gerarBoleto(Boleto boleto) throws BoletoException { 2. // Código de geração do boleto 3. throw new BoletoException(); 4. }
  284. 284. 1. public void gerarBoleto(Boleto boleto) throws BoletoException { 2. // Código de geração do boleto 3. throw new BoletoException(boleto); 4. }
  285. 285. 1. public void gerarBoleto(Boleto boleto) throws BoletoException { 2. // Código de geração do boleto 3. throw new BoletoException(boleto); 4. } 5. 6. public class BoletoException extends Exception { 7. private Boleto boleto; 8. 9. public BoletoException(Boleto boleto) { 10. super(“Não foi possível gerar o boleto. Cedente: ” + boleto.getCedente() + “ Sacado: ” + boleto.getSacado() + “ Valor: ” + boleto.getValor()); 11. this.boleto = boleto; 12. }
  286. 286. Substituir Código de Erro por Exceção
  287. 287. Um método retorna um código especial para indicar um erro. Em vez disso, gere uma exceção.
  288. 288. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public int processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. return 0; 14. } else { 15. return -1; 16. } 17. } 18. }
  289. 289. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public int processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. return 0; 14. } else { 15. return -1; 16. } 17. } 18. }
  290. 290. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. return 0; 14. } else { 15. return -1; 16. } 17. } 18. }
  291. 291. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. return 0; 14. } else { 15. return -1; 16. } 17. } 18. }
  292. 292. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. return 0; 14. } else { 15. return -1; 16. } 17. } 18. }
  293. 293. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. } else { 14. } 15. } 16. }
  294. 294. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. } else { 14. throw new SaldoInsuficienteException(); 15. } 16. } 17. }
  295. 295. Que tipo de exceção utilizar nesse cenário?
  296. 296. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. } else { 14. throw new SaldoInsuficienteException(); 15. } 16. } 17. }
  297. 297. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 11. if (valor <= saldo) { 12. saldo -= valor; 13. } else { 14. throw new SaldoInsuficienteException(); 15. } 16. } 17. }
  298. 298. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 11. if (valor <= saldo) { 12. saldo -= valor; 13. } else { 14. throw new SaldoInsuficienteException(); 15. } 16. } 17. }
  299. 299. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. banco.processarSaque(valor); 4. dispensarDinheiro(valor); 5. exibirMensagem(“Saldo Insuficiente”); 6. } 7. public class Banco { 8. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 9. if (valor <= saldo) { 10. saldo -= valor; 11. } else { 12. throw new SaldoInsuficienteException(); 13. } 14. } 15. }
  300. 300. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. try { 4. banco.processarSaque(valor); 5. dispensarDinheiro(valor); 6. } catch(SaldoInsuficienteException e) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. } 10. public class Banco { 11. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 12. if (valor <= saldo) { 13. saldo -= valor; 14. } else { 15. throw new SaldoInsuficienteException(); 16. } 17. } 18. }
  301. 301. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. try { 4. banco.processarSaque(valor); 5. dispensarDinheiro(valor); 6. } catch(SaldoInsuficienteException e) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. } 10. public class Banco { 11. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 12. if (valor <= saldo) { 13. saldo -= valor; 14. } else { 15. throw new SaldoInsuficienteException(); 16. } 17. } 18. }
  302. 302. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. try { 4. banco.processarSaque(valor); 5. dispensarDinheiro(valor); 6. } catch(SaldoInsuficienteException e) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. } 10. public class Banco { 11. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 12. if (valor > saldo) { 13. saldo -= valor; 14. } else { 15. throw new SaldoInsuficienteException(); 16. } 17. } 18. }
  303. 303. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. try { 4. banco.processarSaque(valor); 5. dispensarDinheiro(valor); 6. } catch(SaldoInsuficienteException e) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. } 10. public class Banco { 11. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 12. if (valor > saldo) throw new SaldoInsuficienteException(); 13. saldo -= valor; 14. } 15. }
  304. 304. Substituir Exceção por Teste
  305. 305. Você está gerando uma exceção em uma condição que o solicitante poderia ter verificado primeiro. Faça o teste primeiro.
  306. 306. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. try { 7. connection = (Connection) available.pop(); 8. return connection; 9. } catch(EmptyStackException e) { 10. connection = new Connection(); 11. return connection; 12. } 13. } 14. }
  307. 307. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. try { 7. connection = (Connection) available.pop(); 8. return connection; 9. } catch(EmptyStackException e) { 10. connection = new Connection(); 11. return connection; 12. } 13. } 14. }
  308. 308. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. 7. try { 8. connection = (Connection) available.pop(); 9. return connection; 10. } catch(EmptyStackException e) { 11. connection = new Connection(); 12. return connection; 13. } 14. } 15. }
  309. 309. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. 8. } 9. try { 10. connection = (Connection) available.pop(); 11. return connection; 12. } catch(EmptyStackException e) { 13. connection = new Connection(); 14. return connection; 15. } 16. }
  310. 310. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. connection = new Connection(); 8. } 9. try { 10. connection = (Connection) available.pop(); 11. return connection; 12. } catch(EmptyStackException e) { 13. return connection; 14. } 15. } 16. }
  311. 311. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. connection = new Connection(); 8. return connection; 9. } 10. try { 11. connection = (Connection) available.pop(); 12. return connection; 13. } catch(EmptyStackException e) { 14. } 15. } 16. }
  312. 312. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. connection = new Connection(); 8. return connection; 9. } 10. connection = (Connection) available.pop(); 11. return connection; 12. } 13. }
  313. 313. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. connection = new Connection(); 8. return connection; 9. } 10. connection = (Connection) available.pop(); 11. return connection; 12. } 13. }
  314. 314. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. connection = new Connection(); 8. return connection; 9. } 10. connection = (Connection) available.pop(); 11. return connection; 12. } 13. }
  315. 315. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. return new Connection(); 8. } 9. connection = (Connection) available.pop(); 10. return connection; 11. } 12. }
  316. 316. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. return new Connection(); 8. } 9. return (Connection) available.pop(); 10. } 11. }
  317. 317. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. if (available.isEmpty()) { 6. return new Connection(); 7. } 8. return (Connection) available.pop(); 9. } 10. }
  318. 318. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. if (available.isEmpty()) return new Connection(); 6. return (Connection) available.pop(); 7. } 8. }
  319. 319. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. return (available.isEmpty()) ? new Connection() : (Connection) available.pop(); 6. } 7. }
  320. 320. Prefira o uso de exceções padrão da linguagem
  321. 321. Você pode utilizar uma das exceção padrão da linguagem para tratar um cenário específico Substitua a exceção customizada pela padrão da linguagem
  322. 322. 1. public void converterVideo(Video video) { 2. if(video == null) { 3. throw new VideoInvalidoException(); 4. } 5. // Código da conversão do video 6. }
  323. 323. Principais exceções da linguagem: IllegalArgumentException IllegalStateException NullPointerException IndexOutOfBoundsException UnsupportedOperationException
  324. 324. 1. public void converterVideo(Video video) { 2. if(video == null) { 3. throw new VideoInvalidoException(); 4. } 5. // Código da conversão do video 6. }
  325. 325. 1. public void converterVideo(Video video) { 2. if(video == null) { 3. throw new (); 4. } 5. // Código da conversão do video 6. }
  326. 326. 1. public void converterVideo(Video video) { 2. if(video == null) { 3. throw new IllegalArgumentException(); 4. } 5. // Código da conversão do video 6. }
  327. 327. Exceção no nível de abstração inadequado
  328. 328. Exceções de camadas inferiores estão sendo tratadas em camadas superiores, fora de seu nível de abstração Trate a exceção em sua camada de forma correta
  329. 329. 1. public class CadastroGUI { 2. CadastroBusiness cadastroBusiness; 3. 4. public void mostrarCliente(int id) { 5. Cliente cliente; 6. try { 7. cliente = cadastroBusiness.buscarCliente(id); 8. } catch (SQLException e) { 9. // Código de tratamento da exceção 10. } 11. // Código de exibição do cliente 12. } 13. }
  330. 330. 1. public class CadastroGUI { 2. CadastroBusiness cadastroBusiness; 3. 4. public void mostrarCliente(int id) { 5. Cliente cliente; 6. try { 7. cliente = cadastroBusiness.buscarCliente(id); 8. } catch (e) { 9. // Código de tratamento 10. } 11. // Código de exibição do cliente 12. } 13. }
  331. 331. 1. public class CadastroGUI { 2. CadastroBusiness cadastroBusiness; 3. 4. public void mostrarCliente(int id) { 5. Cliente cliente; 6. try { 7. cliente = cadastroBusiness.buscarCliente(id); 8. } catch (ClienteNaoEncontradoException e) { 9. // Código de tratamento de clientes não encontrados 10. } 11. // Código de exibição do cliente 12. } 13. }
  332. 332. 1. public class CadastroGUI { 2. CadastroBusiness cadastroBusiness; 3. 4. public void mostrarCliente(int id) { 5. Cliente cliente; 6. try { 7. cliente = cadastroBusiness.buscarCliente(id); 8. } catch (ClienteNaoEncontradoException e) { 9. // Código de tratamento de clientes não encontrados 10. } catch (ClienteDesatualizadoException e) { 11. // Código de tratamento de clientes desatualizados 12. } 13. // Código de exibição do cliente 14. } 15. }
  333. 333. Encapsular Múltiplas Exceções
  334. 334. Você está tratando exceções verificadas (checked) em casos onde não existe recuperação Substitua a exceção verificada por um wrapper que trate as exceções como tempo de execução (Runtime)
  335. 335. 1. public void tratarConteudoDoArquivo(String path) { 2. File arquivo = new File(path); 3. try { 4. FileInputStream input = new FileInputStream(arquivo); 5. byte[] conteudo = new byte[input.available()]; 6. input.read(conteudo); 7. for (byte eachByte : conteudo) { 8. // Código de tratamento do conteúdo 9. } 10. } catch(FileNotFoundException e) { 11. // Fazer o que??? 12. } catch (IOException e) { 13. // Fazer o que??? 14. } 15. }
  336. 336. 1. public class FileReader { 2. }
  337. 337. 1. public class FileReader { 2. public byte[] readFile(String path) { 3. } 4. }
  338. 338. 1. public class FileReader { 2. public byte[] readFile(String path) { 3. try { 4. File file = new File(path); 5. FileInputStream input = new FileInputStream(file); 6. byte[] conteudo = new byte[input.available()]; 7. input.read(conteudo); 8. return conteudo; 9. } catch (FileNotFoundException e) { 10. } catch (IOException e) { 11. } 12. } 13. }
  339. 339. 1. public class FileReader { 2. public byte[] readFile(String path) { 3. try { 4. File file = new File(path); 5. FileInputStream input = new FileInputStream(file); 6. byte[] conteudo = new byte[input.available()]; 7. input.read(conteudo); 8. return conteudo; 9. } catch (FileNotFoundException e) { 10. throw new FileReaderException(e); 11. } catch (IOException e) { 12. } 13. } 14. }
  340. 340. 1. public class FileReader { 2. public byte[] readFile(String path) { 3. try { 4. File file = new File(path); 5. FileInputStream input = new FileInputStream(file); 6. byte[] conteudo = new byte[input.available()]; 7. input.read(conteudo); 8. return conteudo; 9. } catch (FileNotFoundException e) { 10. throw new FileReaderException(e); 11. } catch (IOException e) { 12. throw new FileReaderException(e); 13. } 14. } 15. }
  341. 341. 1. public class FileReader { 2. public byte[] readFile(String path) throws FileReaderExc… { 3. try { 4. File file = new File(path); 5. FileInputStream input = new FileInputStream(file); 6. byte[] conteudo = new byte[input.available()]; 7. input.read(conteudo); 8. return conteudo; 9. } catch (FileNotFoundException e) { 10. throw new FileReaderException(e); 11. } catch (IOException e) { 12. throw new FileReaderException(e); 13. } 14. } 15. }
  342. 342. 1. public void tratarConteudoDoArquivo(String path) { 2. byte[] conteudo = FileReader.readFile(path); 3. for(byte eachByte : conteudo) { 4. // Código de tratamento do conteúdo 5. } 6. }
  343. 343. 1. public void tratarConteudoDoArquivo(String path) { 2. try { 3. byte[] conteudo = FileReader.readFile(path); 4. } catch (FileReaderException e) { 5. } 6. for(byte eachByte : conteudo) { 7. // Código de tratamento do conteúdo 8. } 9. }
  344. 344. 1. public void tratarConteudoDoArquivo(String path) { 2. try { 3. byte[] conteudo = FileReader.readFile(path); 4. } catch (FileReaderException e) { 5. 6. } 7. for(byte eachByte : conteudo) { 8. // Código de tratamento do conteúdo 9. } 10. }
  345. 345. 1. public void tratarConteudoDoArquivo(String path) { 2. try { 3. byte[] conteudo = FileReader.readFile(path); 4. } catch (FileReaderException e) { 5. // Código de tratamento da exceção 6. } 7. for(byte eachByte : conteudo) { 8. // Código de tratamento do conteúdo 9. } 10. }

×