Técnicas de Refactoring

  • 436 views
Uploaded on

Técnicas de Refactoring

Técnicas de Refactoring

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
436
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
0
Comments
0
Likes
6

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Técnicas de Refactoring Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br
  • 2. “Transformar equipes de desenvolvimento de software” http://www.agilecode.com.br
  • 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. 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. • 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. Compondo métodos
  • 7. Extrair Método
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. 8. }
  • 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. 1. public void exibirExtrato(Periodo periodo) { 2. 3. imprimirCabecalho(); 4. 5. imprimirDetalhes(periodo); 6. 7. imprimirRodape(); 8. }
  • 20. 1. public void exibirExtrato(Periodo periodo) { 2. imprimirCabecalho(); 3. imprimirDetalhes(periodo); 4. imprimirRodape(); 5. }
  • 21. 1. public void exibirExtrato(Periodo periodo) { 2. imprimirCabecalho(); 3. imprimirDetalhes(periodo); 4. imprimirRodape(); 5. }
  • 22. Atalho do Eclipse: Shift + Alt + M
  • 23. Internalizar Método
  • 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. 1. int lerAvaliacao( ) { 2. return (maisDeCincoAtrasos()) ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  • 26. 1. int lerAvaliacao( ) { 2. return (maisDeCincoAtrasos()) ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  • 27. 1. int lerAvaliacao( ) { 2. return () ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  • 28. 1. int lerAvaliacao( ) { 2. return (numeroDeAtrasos > 5) ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  • 29. 1. int lerAvaliacao( ) { 2. return (numeroDeAtrasos > 5) ? 2 : 1; 3. }
  • 30. Atalho do Eclipse: Shift + Alt + I
  • 31. Internalizar Variável Temporária
  • 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. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return preco > 1000; 4. }
  • 34. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return preco > 1000; 4. }
  • 35. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return > 1000; 4. }
  • 36. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return pedido.getPreco() > 1000; 4. }
  • 37. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return pedido.getPreco() > 1000; 4. }
  • 38. 1. boolean produtoCaro() { 2. return pedido.getPreco() > 1000; 3. }
  • 39. Atalho do Eclipse: Shift + Alt + I
  • 40. Introduzir Variável Explicativa
  • 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. 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. 1. double calculaValorDaCorrida() { 2. if () { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 44. 1. double calculaValorDaCorrida() { 2. if (bandeiraDois) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 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. Atalho do Eclipse: Shift + Alt + L
  • 47. Alternativa Também é interessante optar por uma extração de método para aumentar a possibilidade de reuso.
  • 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. 1. double calculaValorDaCorrida() { 2. if () { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 50. 1. double calculaValorDaCorrida() { 2. if (bandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 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. Atalho do Eclipse: Shift + Alt + M
  • 53. Dividir Variável Temporária
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Atalho do Eclipse: Shift + Alt + R
  • 67. Remover Atribuições a Parâmetros
  • 68. O código faz atribuições a parâmetros. Utilize uma variável temporária no lugar da atribuição
  • 69. 1. void desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  • 70. 1. void desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  • 71. 1. desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  • 72. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  • 73. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. 4. } 5. }
  • 74. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. }
  • 75. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. 6. }
  • 76. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. return 0.0; 6. }
  • 77. Substituir Números Mágicos por Constantes
  • 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. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * 9.81 * altura; 5. } 6. 7. }
  • 80. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * 9.81 * altura; 5. } 6. 7. }
  • 81. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * * altura; 5. } 6. 7. }
  • 82. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * GRAVIDADE * altura; 5. } 6. 7. }
  • 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. Eclipse: Ctrl + 3, Extract Constant
  • 85. Renomear Método
  • 86. O nome de um método não está revelando seu propósito. Altere o nome do método.
  • 87. 1. public void processar() { 2. // Código para processar 3. }
  • 88. 1. public void () { 2. // Código para processar 3. }
  • 89. 1. public void processarFolhaDePagamento() { 2. // Código para processar folha de pagamento 3. }
  • 90. Preservar o Objeto Inteiro
  • 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. 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. E se houver uma modificação que solicita a inclusão de mais uma nota?
  • 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. 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. 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. A tendência é o método crescer...
  • 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. 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. 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. 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. 1. public class Boletim { 2. public void renderizarMedia() { 3. double media = calcularMedia(notasParciais); 4. } 5. }
  • 103. 1. public class Boletim { 2. public void renderizarMedia() { 3. double media = calcularMedia(notasParciais); 4. } 5. }
  • 104. Cuidado com o HttpServletRequest
  • 105. Atalho do Eclipse: Shift + Alt + R
  • 106. Substituir Algoritmo
  • 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. Simplificando Expressões Condicionais
  • 109. Decompor Condicional
  • 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. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 112. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 113. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 114. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 115. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 116. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. 6. } 7. }
  • 117. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. return calcularBandeiraUm(distancia); 6. } 7. }
  • 118. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. return calcularBandeiraUm(distancia); 6. } 7. }
  • 119. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } 5. return calcularBandeiraUm(distancia); 6. }
  • 120. 1. double calculaValorDaCorrida() { 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } 5. return calcularBandeiraUm(distancia); 6. }
  • 121. Atalho do Eclipse: Shift + Alt + M
  • 122. Consolidar Expressão Condicional
  • 123. Você tem uma sequência de testes com o mesmo resultado. Consolide-os em uma única expressão e extraia-a.
  • 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. 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. 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. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. if (temCarteirinha && naoEhFalsa) { 4. return valor * 0.5; 5. } 6. } 7. return valor; 8. }
  • 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. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. 4. return valor * 0.5; 5. 6. } 7. return valor; 8. }
  • 130. 1. int calcularEntrada(int valor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. 4. return valor * 0.5; 5. 6. } 7. return valor; 8. }
  • 131. 1. int calcularEntrada(int valor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 132. 1. int calcularEntrada(int valor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 133. 1. int calcularEntrada(int valor) { 2. if () { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 134. 1. int calcularEntrada(int valor) { 2. if (aptoAPagarMeiaEntrada()) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 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. 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. Consolidar Fragmentos Condicionais Duplicados
  • 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. 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. 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. 1. public void sendRequest(Object data) { 2. if (data == null) { 3. } else { 4. resource.setData(data); 5. } 6. }
  • 142. 1. public void sendRequest(Object data) { 2. if (data == null) { 3. } else { 4. resource.setData(data); 5. } 6. resource.send(); 7. }
  • 143. 1. public void sendRequest(Object data) { 2. if (data != null) { 3. } else { 4. resource.setData(data); 5. } 6. resource.send(); 7. }
  • 144. 1. public void sendRequest(Object data) { 2. if (data != null) { 3. resource.setData(data); 4. } 5. resource.send(); 6. }
  • 145. 1. public void sendRequest(Object data) { 2. if (data != null) resource.setData(data); 3. resource.send(); 4. }
  • 146. Remover Condição Aninhada por Cláusulas Guarda
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Substituir Comando Condicional por Polimorfismo
  • 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. 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. E se houver um novo tipo de extrato?
  • 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. 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. 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. Este método tende ao infinito...
  • 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. 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. 1. public void emitirExtrato(String tipo) { 2. Extrato.criarExtrato(tipo).emitir(); 3. }
  • 186. Introduzir Comando Ternário
  • 187. Você tem um if apenas para decidir qual atribuição realizar. Utilize um comando ternário.
  • 188. (expressão condicional) ? true : false;
  • 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. 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. 1. public void calcularImposto(int valor) { 2. int imposto = 3. return imposto; 4. }
  • 192. 1. public void calcularImposto(int valor) { 2. int imposto = (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. return imposto; 4. }
  • 193. 1. public void calcularImposto(int valor) { 2. int imposto = (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. return imposto; 4. }
  • 194. 1. public void calcularImposto(int valor) { 2. return (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. }
  • 195. Remover Comando Ternário
  • 196. Você tem um ternário aninhado que se tornou complexo de entender. Mude o ternário para um if.
  • 197. 1. public void calcularImposto(int valor) { 2. return (valor > 1000) ? (valor < 10000) ? valor * 0.05 : valor * 0.10 : valor * 0.02; 3. }
  • 198. Refatorando Classes
  • 199. Extrair Classe
  • 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. 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. 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. 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. 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. 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. 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. Ocultar Delegação
  • 208. Uma classe referencia uma outra classe delegada por um objeto. Crie métodos no servidor para ocultar a delegação.
  • 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. 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. 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. 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. Substituindo Construtor por Método Fábrica
  • 214. Você tem muitos construtores que fazem coisas diferentes. Utilize métodos fábrica para tornar a construção mais intuitiva.
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Criar um Template Method
  • 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. 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. 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. 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. 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. 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. 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. 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. Criar um Strategy Enum
  • 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. 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. 1. public enum TipoExtrato { 2. SimplificadoMensal, 3. SimplificadoQuinzenal, 4. SimplificadoSemanal, 5. Completo; 6. }
  • 247. 1. public enum TipoExtrato { 2. SimplificadoMensal, 3. SimplificadoQuinzenal, 4. SimplificadoSemanal, 5. Completo; 6. 7. public abstract void emitirExtrato(); 8. }
  • 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. 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. 1. public class Banco { 2. 3. public void emitirExtrato(String tipo) { 4. } 5. 6. }
  • 251. 1. public class Banco { 2. 3. public void emitirExtrato(String tipo) { 4. TipoExtrato.valueOf(tipo).emitir(); 5. } 6. 7. }
  • 252. Substituindo Construtores por Fluent Interface
  • 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. 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. 1. Date data = november(20, 2005);
  • 256. 1. new Image(“cat.jpg”) 2. .rotate(90) 3. .watermark(“Copyright - 2012”) 4. .blackAndWhite() 5. .save(“catAfterChanges.jpg”);
  • 257. Encapsular Coleção
  • 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. 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. 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. 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. 1. public class Biblioteca { 2. 3. private Set<Livro> livros; 4. 5. }
  • 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. 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. Lidando com exceções
  • 266. Evite lançar exceções genéricas
  • 267. Você está lançando uma exceção genérica Tente lançar exceções específicas
  • 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. 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. 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. 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. Evite tratar exceções de forma genérica
  • 273. Você possui um bloco catch tratando exceções genéricas Utilize exceções específicas
  • 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. 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. Não ignore exceções
  • 277. Você possui um bloco catch vazio Avalie se faz sentido continuar utilizando uma exceção verificada (checked)
  • 278. 1. try { 2. // Código que lança a exceção. 3. } catch (SomeException e) { 4. // ??? 5. }
  • 279. 1. try { 2. // Código que lança a exceção. 3. } catch (SomeException e) { 4. 5. }
  • 280. 1. try { 2. // Código que lança a exceção. 3. } catch (SomeException e) { 4. e.printStacktrace(); 5. }
  • 281. Exceção lançada sem informações de captura
  • 282. Existem exceções sendo lançadas sem uma mensagem contendo a explicação detalhada da falha Define uma mensagem detalhando a falha
  • 283. 1. public void gerarBoleto(Boleto boleto) throws BoletoException { 2. // Código de geração do boleto 3. throw new BoletoException(); 4. }
  • 284. 1. public void gerarBoleto(Boleto boleto) throws BoletoException { 2. // Código de geração do boleto 3. throw new BoletoException(boleto); 4. }
  • 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. Substituir Código de Erro por Exceção
  • 287. Um método retorna um código especial para indicar um erro. Em vez disso, gere uma exceção.
  • 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. 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. 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. 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. 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. 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. 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. Que tipo de exceção utilizar nesse cenário?
  • 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. 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. 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. 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. 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. 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. 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. 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. Substituir Exceção por Teste
  • 305. Você está gerando uma exceção em uma condição que o solicitante poderia ter verificado primeiro. Faça o teste primeiro.
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Prefira o uso de exceções padrão da linguagem
  • 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. 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. Principais exceções da linguagem: IllegalArgumentException IllegalStateException NullPointerException IndexOutOfBoundsException UnsupportedOperationException
  • 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. 1. public void converterVideo(Video video) { 2. if(video == null) { 3. throw new (); 4. } 5. // Código da conversão do video 6. }
  • 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. Exceção no nível de abstração inadequado
  • 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. 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. 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. 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. 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. Encapsular Múltiplas Exceções
  • 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. 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. 1. public class FileReader { 2. }
  • 337. 1. public class FileReader { 2. public byte[] readFile(String path) { 3. } 4. }
  • 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. 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. 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. 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. 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. 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. 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. 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. }