Técnicas de Refactoring
Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br
“Transformar equipes de desenvolvimento de software”
http://www.agilecode.com.br
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
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.
• 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.
Compondo métodos
Extrair Método
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.
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
1. public void exibirExtrato(Periodo periodo) {
2. // imprimir cabeçalho
3. imprimirCabecalho();
4. // imprimir detalhes
5. imprimirDetalhes(periodo);
6. // imprimir rodapé
7.
8. }
1. public void exibirExtrato(Periodo periodo) {
2. // imprimir cabeçalho
3. imprimirCabecalho();
4. // imprimir detalhes
5. imprimirDetalhes(periodo);
6. // imprimir rodapé
7. imprimirRodape();
8. }
1. public void exibirExtrato(Periodo periodo) {
2.
3. imprimirCabecalho();
4.
5. imprimirDetalhes(periodo);
6.
7. imprimirRodape();
8. }
1. public void exibirExtrato(Periodo periodo) {
2. imprimirCabecalho();
3. imprimirDetalhes(periodo);
4. imprimirRodape();
5. }
1. public void exibirExtrato(Periodo periodo) {
2. imprimirCabecalho();
3. imprimirDetalhes(periodo);
4. imprimirRodape();
5. }
Atalho do Eclipse:
Shift + Alt + M
Internalizar Método
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.
1. int lerAvaliacao( ) {
2. return (maisDeCincoAtrasos()) ? 2 : 1;
3. }
4.
5. boolean maisDeCincoAtrasos() {
6. return numeroDeAtrasos > 5;
7. }
1. int lerAvaliacao( ) {
2. return (maisDeCincoAtrasos()) ? 2 : 1;
3. }
4.
5. boolean maisDeCincoAtrasos() {
6. return numeroDeAtrasos > 5;
7. }
1. int lerAvaliacao( ) {
2. return () ? 2 : 1;
3. }
4.
5. boolean maisDeCincoAtrasos() {
6. return numeroDeAtrasos > 5;
7. }
1. int lerAvaliacao( ) {
2. return (numeroDeAtrasos > 5) ? 2 : 1;
3. }
4.
5. boolean maisDeCincoAtrasos() {
6. return numeroDeAtrasos > 5;
7. }
1. int lerAvaliacao( ) {
2. return (numeroDeAtrasos > 5) ? 2 : 1;
3. }
Atalho do Eclipse:
Shift + Alt + I
Internalizar Variável
Temporária
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.
1. boolean produtoCaro() {
2. double preco = pedido.getPreco();
3. return preco > 1000;
4. }
1. boolean produtoCaro() {
2. double preco = pedido.getPreco();
3. return preco > 1000;
4. }
1. boolean produtoCaro() {
2. double preco = pedido.getPreco();
3. return > 1000;
4. }
1. boolean produtoCaro() {
2. double preco = pedido.getPreco();
3. return pedido.getPreco() > 1000;
4. }
1. boolean produtoCaro() {
2. double preco = pedido.getPreco();
3. return pedido.getPreco() > 1000;
4. }
1. boolean produtoCaro() {
2. return pedido.getPreco() > 1000;
3. }
Atalho do Eclipse:
Shift + Alt + I
Introduzir Variável
Explicativa
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.
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. }
1. double calculaValorDaCorrida() {
2. if () {
3. return distancia * 3.90;
4. } else {
5. return distancia * 2.10;
6. }
7. }
1. double calculaValorDaCorrida() {
2. if (bandeiraDois) {
3. return distancia * 3.90;
4. } else {
5. return distancia * 2.10;
6. }
7. }
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. }
Atalho do Eclipse:
Shift + Alt + L
Alternativa
Também é interessante optar por uma
extração de método para aumentar a
possibilidade de reuso.
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. }
1. double calculaValorDaCorrida() {
2. if () {
3. return distancia * 3.90;
4. } else {
5. return distancia * 2.10;
6. }
7. }
1. double calculaValorDaCorrida() {
2. if (bandeiraDois()) {
3. return distancia * 3.90;
4. } else {
5. return distancia * 2.10;
6. }
7. }
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. }
Atalho do Eclipse:
Shift + Alt + M
Dividir Variável
Temporária
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.
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
1. public class PoteDeWhey {
2. int pesoDoPote;
3. int pesoDaDose;
4. int proteinasPorDose;
5.
6. double calcularPrecoPorProteina(double precoPote) {
7. return getDoses()/getTotalProteinas();
8. }
Atalho do Eclipse:
Shift + Alt + R
Remover Atribuições a
Parâmetros
O código faz atribuições a
parâmetros.
Utilize uma variável temporária no lugar
da atribuição
1. void desconto(Carrinho carrinho) {
2. if (carrinho.getQuantidadeDeProdutos() > 50) {
3. carrinho.setDesconto(0.10);
4. }
5. }
1. void desconto(Carrinho carrinho) {
2. if (carrinho.getQuantidadeDeProdutos() > 50) {
3. carrinho.setDesconto(0.10);
4. }
5. }
1. desconto(Carrinho carrinho) {
2. if (carrinho.getQuantidadeDeProdutos() > 50) {
3. carrinho.setDesconto(0.10);
4. }
5. }
1. double desconto(Carrinho carrinho) {
2. if (carrinho.getQuantidadeDeProdutos() > 50) {
3. carrinho.setDesconto(0.10);
4. }
5. }
1. double desconto(Carrinho carrinho) {
2. if (carrinho.getQuantidadeDeProdutos() > 50) {
3.
4. }
5. }
1. double desconto(Carrinho carrinho) {
2. if (carrinho.getQuantidadeDeProdutos() > 50) {
3. return 0.10;
4. }
5. }
1. double desconto(Carrinho carrinho) {
2. if (carrinho.getQuantidadeDeProdutos() > 50) {
3. return 0.10;
4. }
5.
6. }
1. double desconto(Carrinho carrinho) {
2. if (carrinho.getQuantidadeDeProdutos() > 50) {
3. return 0.10;
4. }
5. return 0.0;
6. }
Substituir Números
Mágicos por Constantes
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.
1. public class Fisica {
2.
3. double energiaPotencial(double massa, double altura) {
4. return massa * 9.81 * altura;
5. }
6.
7. }
1. public class Fisica {
2.
3. double energiaPotencial(double massa, double altura) {
4. return massa * 9.81 * altura;
5. }
6.
7. }
1. public class Fisica {
2.
3. double energiaPotencial(double massa, double altura) {
4. return massa * * altura;
5. }
6.
7. }
1. public class Fisica {
2.
3. double energiaPotencial(double massa, double altura) {
4. return massa * GRAVIDADE * altura;
5. }
6.
7. }
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. }
Eclipse:
Ctrl + 3, Extract Constant
Renomear Método
O nome de um método não está
revelando seu propósito.
Altere o nome do método.
1. public void processar() {
2. // Código para processar
3. }
1. public void () {
2. // Código para processar
3. }
1. public void processarFolhaDePagamento() {
2. // Código para processar folha de pagamento
3. }
Preservar o Objeto
Inteiro
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.
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. }
E se houver uma modificação que
solicita a inclusão de mais uma nota?
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. }
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. }
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. }
A tendência é o método crescer...
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. }
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. }
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. }
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. }
1. public class Boletim {
2. public void renderizarMedia() {
3. double media = calcularMedia(notasParciais);
4. }
5. }
1. public class Boletim {
2. public void renderizarMedia() {
3. double media = calcularMedia(notasParciais);
4. }
5. }
Cuidado com o HttpServletRequest
Atalho do Eclipse:
Shift + Alt + R
Substituir Algoritmo
Você tem um algoritmo confuso e as
refatorações não estão ajudando.
Substitua o corpo do método por
um novo algoritmo.
Simplificando Expressões
Condicionais
Decompor Condicional
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.
1. double calculaValorDaCorrida() {
2. if (isBandeiraDois()) {
3. return distancia * 3.90;
4. } else {
5. return distancia * 2.10;
6. }
7. }
1. double calculaValorDaCorrida() {
2. if (isBandeiraDois()) {
3. return distancia * 3.90;
4. } else {
5. return distancia * 2.10;
6. }
7. }
1. double calculaValorDaCorrida() {
2. if (isBandeiraDois()) {
3.
4. } else {
5. return distancia * 2.10;
6. }
7. }
1. double calculaValorDaCorrida() {
2. if (isBandeiraDois()) {
3. return calcularBandeiraDois(distancia);
4. } else {
5. return distancia * 2.10;
6. }
7. }
1. double calculaValorDaCorrida() {
2. if (isBandeiraDois()) {
3. return calcularBandeiraDois(distancia);
4. } else {
5. return distancia * 2.10;
6. }
7. }
1. double calculaValorDaCorrida() {
2. if (isBandeiraDois()) {
3. return calcularBandeiraDois(distancia);
4. } else {
5.
6. }
7. }
1. double calculaValorDaCorrida() {
2. if (isBandeiraDois()) {
3. return calcularBandeiraDois(distancia);
4. } else {
5. return calcularBandeiraUm(distancia);
6. }
7. }
1. double calculaValorDaCorrida() {
2. if (isBandeiraDois()) {
3. return calcularBandeiraDois(distancia);
4. } else {
5. return calcularBandeiraUm(distancia);
6. }
7. }
1. double calculaValorDaCorrida() {
2. if (isBandeiraDois()) {
3. return calcularBandeiraDois(distancia);
4. }
5. return calcularBandeiraUm(distancia);
6. }
1. double calculaValorDaCorrida() {
2. if (isBandeiraDois()) {
3. return calcularBandeiraDois(distancia);
4. }
5. return calcularBandeiraUm(distancia);
6. }
Atalho do Eclipse:
Shift + Alt + M
Consolidar Expressão
Condicional
Você tem uma sequência de testes com
o mesmo resultado.
Consolide-os em uma única expressão
e extraia-a.
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. }
1. int calcularEntrada(int valor) {
2. if (estudante) {
3. if (temCarteirinha) {
4.
5. return valor * 0.5;
6.
7. }
8. }
9. return valor;
10. }
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. }
1. int calcularEntrada(int valor) {
2. if (estudante) {
3. if (temCarteirinha && naoEhFalsa) {
4. return valor * 0.5;
5. }
6. }
7. return valor;
8. }
1. int calcularEntrada(int valor) {
2. if (estudante) {
3. if (temCarteirinha && naoEhFalsa) {
4. return valor * 0.5;
5. }
6. }
7. return valor;
8. }
1. int calcularEntrada(int valor) {
2. if (estudante) {
3.
4. return valor * 0.5;
5.
6. }
7. return valor;
8. }
1. int calcularEntrada(int valor) {
2. if (estudante && temCarteirinha && naoEhFalsa) {
3.
4. return valor * 0.5;
5.
6. }
7. return valor;
8. }
1. int calcularEntrada(int valor) {
2. if (estudante && temCarteirinha && naoEhFalsa) {
3. return valor * 0.5;
4. }
5. return valor;
6. }
1. int calcularEntrada(int valor) {
2. if (estudante && temCarteirinha && naoEhFalsa) {
3. return valor * 0.5;
4. }
5. return valor;
6. }
1. int calcularEntrada(int valor) {
2. if () {
3. return valor * 0.5;
4. }
5. return valor;
6. }
1. int calcularEntrada(int valor) {
2. if (aptoAPagarMeiaEntrada()) {
3. return valor * 0.5;
4. }
5. return valor;
6. }
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. }
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. }
Consolidar Fragmentos
Condicionais Duplicados
O mesmo fragmento de código aparece
duplicado em todos os remos de uma
expressão condicional.
Mova-os para fora da expressão.
1. public void sendRequest(Object data) {
2. if (data == null) {
3. resource.send();
4. } else {
5. resource.setData(data);
6. resource.send();
7. }
8. }
1. public void sendRequest(Object data) {
2. if (data == null) {
3. resource.send();
4. } else {
5. resource.setData(data);
6. resource.send();
7. }
8. }
1. public void sendRequest(Object data) {
2. if (data == null) {
3. } else {
4. resource.setData(data);
5. }
6. }
1. public void sendRequest(Object data) {
2. if (data == null) {
3. } else {
4. resource.setData(data);
5. }
6. resource.send();
7. }
1. public void sendRequest(Object data) {
2. if (data != null) {
3. } else {
4. resource.setData(data);
5. }
6. resource.send();
7. }
1. public void sendRequest(Object data) {
2. if (data != null) {
3. resource.setData(data);
4. }
5. resource.send();
6. }
1. public void sendRequest(Object data) {
2. if (data != null) resource.setData(data);
3. resource.send();
4. }
Remover Condição
Aninhada por Cláusulas
Guarda
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.
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
Substituir Comando
Condicional por
Polimorfismo
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.
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. }
E se houver um novo tipo de extrato?
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. }
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. }
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. }
Este método tende ao infinito...
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. }
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. }
1. public void emitirExtrato(String tipo) {
2. Extrato.criarExtrato(tipo).emitir();
3. }
Introduzir Comando
Ternário
Você tem um if apenas para decidir
qual atribuição realizar.
Utilize um comando ternário.
(expressão condicional) ? true : false;
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. }
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. }
1. public void calcularImposto(int valor) {
2. int imposto =
3. return imposto;
4. }
1. public void calcularImposto(int valor) {
2. int imposto = (valor > 1000) ? valor * 0.05 : valor * 0.02;
3. return imposto;
4. }
1. public void calcularImposto(int valor) {
2. int imposto = (valor > 1000) ? valor * 0.05 : valor * 0.02;
3. return imposto;
4. }
1. public void calcularImposto(int valor) {
2. return (valor > 1000) ? valor * 0.05 : valor * 0.02;
3. }
Remover Comando
Ternário
Você tem um ternário aninhado que se
tornou complexo de entender.
Mude o ternário para um if.
1. public void calcularImposto(int valor) {
2. return (valor > 1000) ? (valor < 10000) ? valor * 0.05 : valor * 0.10 : valor * 0.02;
3. }
Refatorando Classes
Extrair Classe
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.
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. }
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. }
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. }
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. }
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. }
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. }
Ocultar Delegação
Uma classe referencia uma outra
classe delegada por um objeto.
Crie métodos no servidor para ocultar
a delegação.
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. }
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. }
1. // Código da classe PaperBoy…
2. double valorAPagar = 2.00;
3. if () {
4.
5. } else {
6. // Volte quando tiver dinheiro para pagar…
7. }
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. }
Substituindo Construtor
por Método Fábrica
Você tem muitos construtores
que fazem coisas diferentes.
Utilize métodos fábrica para
tornar a construção mais
intuitiva.
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
Criar um
Template Method
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.
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. }
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. }
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. }
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. }
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. }
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. }
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. }
Criar um
Strategy Enum
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.
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. }
1. public enum TipoExtrato {
2. SimplificadoMensal,
3. SimplificadoQuinzenal,
4. SimplificadoSemanal,
5. Completo;
6. }
1. public enum TipoExtrato {
2. SimplificadoMensal,
3. SimplificadoQuinzenal,
4. SimplificadoSemanal,
5. Completo;
6.
7. public abstract void emitirExtrato();
8. }
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. }
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. }
1. public class Banco {
2.
3. public void emitirExtrato(String tipo) {
4. }
5.
6. }
1. public class Banco {
2.
3. public void emitirExtrato(String tipo) {
4. TipoExtrato.valueOf(tipo).emitir();
5. }
6.
7. }
Substituindo Construtores
por Fluent Interface
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.
1. new EmailMessage()
2. .from(“rodrigo.branas@gmail.com”)
3. .to(“contato@globo.com”)
4. .withSubject(“Fluent API - Demo”)
5. .withMessage(“Message…”)
6. .send();
1. Date data = november(20, 2005);
1. new Image(“cat.jpg”)
2. .rotate(90)
3. .watermark(“Copyright - 2012”)
4. .blackAndWhite()
5. .save(“catAfterChanges.jpg”);
Encapsular Coleção
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.
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. ...
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. }
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. }
1. public class Biblioteca {
2.
3. private Set<Livro> livros;
4.
5. }
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. }
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. ...
Lidando com exceções
Evite lançar exceções genéricas
Você está lançando uma exceção
genérica
Tente lançar exceções específicas
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. }
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. }
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. }
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. }
Evite tratar exceções de forma
genérica
Você possui um bloco catch
tratando exceções genéricas
Utilize exceções específicas
1. try {
2. // Código que lança a exceção.
3. } catch (Exception e) {
4. // Código de tratamento da exceção
5. }
1. try {
2. // Código que lança a exceção.
3. } catch (Throwable e) {
4. // Código de tratamento da exceção
5. }
Não ignore exceções
Você possui um bloco catch vazio
Avalie se faz sentido continuar
utilizando uma exceção verificada
(checked)
1. try {
2. // Código que lança a exceção.
3. } catch (SomeException e) {
4. // ???
5. }
1. try {
2. // Código que lança a exceção.
3. } catch (SomeException e) {
4.
5. }
1. try {
2. // Código que lança a exceção.
3. } catch (SomeException e) {
4. e.printStacktrace();
5. }
Exceção lançada sem
informações de captura
Existem exceções sendo lançadas sem
uma mensagem contendo a explicação
detalhada da falha
Define uma mensagem detalhando a
falha
1. public void gerarBoleto(Boleto boleto) throws BoletoException {
2. // Código de geração do boleto
3. throw new BoletoException();
4. }
1. public void gerarBoleto(Boleto boleto) throws BoletoException {
2. // Código de geração do boleto
3. throw new BoletoException(boleto);
4. }
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. }
Substituir Código de Erro
por Exceção
Um método retorna um código especial
para indicar um erro.
Em vez disso, gere uma exceção.
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. }
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. }
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. }
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. }
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. }
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. }
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. }
Que tipo de exceção utilizar nesse
cenário?
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
Substituir Exceção por
Teste
Você está gerando uma exceção em
uma condição que o solicitante poderia
ter verificado primeiro.
Faça o teste primeiro.
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
1. public class ConnectionPool {
2. private Stack available;
3.
4. public Connection getConnection() {
5. return (available.isEmpty()) ? new Connection() : (Connection) available.pop();
6. }
7. }
Prefira o uso de exceções
padrão da linguagem
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
1. public void converterVideo(Video video) {
2. if(video == null) {
3. throw new VideoInvalidoException();
4. }
5. // Código da conversão do video
6. }
Principais exceções da linguagem:
IllegalArgumentException
IllegalStateException
NullPointerException
IndexOutOfBoundsException
UnsupportedOperationException
1. public void converterVideo(Video video) {
2. if(video == null) {
3. throw new VideoInvalidoException();
4. }
5. // Código da conversão do video
6. }
1. public void converterVideo(Video video) {
2. if(video == null) {
3. throw new ();
4. }
5. // Código da conversão do video
6. }
1. public void converterVideo(Video video) {
2. if(video == null) {
3. throw new IllegalArgumentException();
4. }
5. // Código da conversão do video
6. }
Exceção no nível de abstração
inadequado
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
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. }
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. }
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. }
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. }
Encapsular Múltiplas
Exceções
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)
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. }
1. public class FileReader {
2. }
1. public class FileReader {
2. public byte[] readFile(String path) {
3. }
4. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }
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. }

Técnicas de Refactoring

  • 1.
    Técnicas de Refactoring RodrigoBranas – @rodrigobranas - http://www.agilecode.com.br
  • 2.
    “Transformar equipes dedesenvolvimento de software” http://www.agilecode.com.br
  • 3.
    Rodrigo Branas rodrigo.branas@agilecode.com.br http://www.agilecode.com.br • DesenvolvendoSoftware 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 daComputaçã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á maisde 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.
  • 7.
  • 8.
    Existe um fragmentode 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 voidexibirExtrato(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 voidexibirExtrato(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 voidexibirExtrato(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 voidexibirExtrato(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 voidexibirExtrato(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 voidexibirExtrato(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 voidexibirExtrato(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 voidexibirExtrato(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 voidexibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. 8. }
  • 18.
    1. public voidexibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. imprimirRodape(); 8. }
  • 19.
    1. public voidexibirExtrato(Periodo periodo) { 2. 3. imprimirCabecalho(); 4. 5. imprimirDetalhes(periodo); 6. 7. imprimirRodape(); 8. }
  • 20.
    1. public voidexibirExtrato(Periodo periodo) { 2. imprimirCabecalho(); 3. imprimirDetalhes(periodo); 4. imprimirRodape(); 5. }
  • 21.
    1. public voidexibirExtrato(Periodo periodo) { 2. imprimirCabecalho(); 3. imprimirDetalhes(periodo); 4. imprimirRodape(); 5. }
  • 22.
  • 23.
  • 24.
    O corpo domé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.
  • 31.
  • 32.
    Você tem umavariá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.
  • 40.
  • 41.
    Você tem umaexpressã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.
  • 47.
    Alternativa Também é interessanteoptar 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.
  • 53.
  • 54.
    Você tem umavariá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 classPoteDeWhey { 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 classPoteDeWhey { 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 classPoteDeWhey { 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 classPoteDeWhey { 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 classPoteDeWhey { 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 classPoteDeWhey { 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 classPoteDeWhey { 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 classPoteDeWhey { 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 classPoteDeWhey { 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 classPoteDeWhey { 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 classPoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. return getDoses()/getTotalProteinas(); 8. }
  • 66.
  • 67.
  • 68.
    O código fazatribuições a parâmetros. Utilize uma variável temporária no lugar da atribuição
  • 69.
    1. void desconto(Carrinhocarrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  • 70.
    1. void desconto(Carrinhocarrinho) { 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(Carrinhocarrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  • 73.
    1. double desconto(Carrinhocarrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. 4. } 5. }
  • 74.
    1. double desconto(Carrinhocarrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. }
  • 75.
    1. double desconto(Carrinhocarrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. 6. }
  • 76.
    1. double desconto(Carrinhocarrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. return 0.0; 6. }
  • 77.
  • 78.
    Você tem umnú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 classFisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * 9.81 * altura; 5. } 6. 7. }
  • 80.
    1. public classFisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * 9.81 * altura; 5. } 6. 7. }
  • 81.
    1. public classFisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * * altura; 5. } 6. 7. }
  • 82.
    1. public classFisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * GRAVIDADE * altura; 5. } 6. 7. }
  • 83.
    1. public classFisica { 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.
  • 86.
    O nome deum método não está revelando seu propósito. Altere o nome do método.
  • 87.
    1. public voidprocessar() { 2. // Código para processar 3. }
  • 88.
    1. public void() { 2. // Código para processar 3. }
  • 89.
    1. public voidprocessarFolhaDePagamento() { 2. // Código para processar folha de pagamento 3. }
  • 90.
  • 91.
    Você está lendodiverso 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 classBoletim { 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 houveruma modificação que solicita a inclusão de mais uma nota?
  • 94.
    1. public classBoletim { 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 classBoletim { 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 classBoletim { 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 classBoletim { 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 classBoletim { 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 classBoletim { 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 classBoletim { 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 classBoletim { 2. public void renderizarMedia() { 3. double media = calcularMedia(notasParciais); 4. } 5. }
  • 103.
    1. public classBoletim { 2. public void renderizarMedia() { 3. double media = calcularMedia(notasParciais); 4. } 5. }
  • 104.
    Cuidado com oHttpServletRequest
  • 105.
  • 106.
  • 107.
    Você tem umalgoritmo confuso e as refatorações não estão ajudando. Substitua o corpo do método por um novo algoritmo.
  • 109.
  • 110.
  • 111.
    Você tem umaestrutura condicional complicada. Extraia métodos para a condição, para a parte após o then e para a parte após o else.
  • 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. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 114.
    1. double calculaValorDaCorrida(){ 2. if (isBandeiraDois()) { 3. 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. return distancia * 2.10; 6. } 7. }
  • 117.
    1. double calculaValorDaCorrida(){ 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } else { 5. 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. } else { 5. return calcularBandeiraUm(distancia); 6. } 7. }
  • 120.
    1. double calculaValorDaCorrida(){ 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } 5. return calcularBandeiraUm(distancia); 6. }
  • 121.
    1. double calculaValorDaCorrida(){ 2. if (isBandeiraDois()) { 3. return calcularBandeiraDois(distancia); 4. } 5. return calcularBandeiraUm(distancia); 6. }
  • 122.
  • 123.
  • 124.
    Você tem umasequência de testes com o mesmo resultado. Consolide-os em uma única expressão e extraia-a.
  • 125.
    1. int calcularEntrada(intvalor) { 2. if (estudante) { 3. if (temCarteirinha) { 4. if (naoEhFalsa) { 5. return valor * 0.5; 6. } 7. } 8. } 9. return valor; 10. }
  • 126.
    1. int calcularEntrada(intvalor) { 2. if (estudante) { 3. if (temCarteirinha) { 4. 5. return valor * 0.5; 6. 7. } 8. } 9. return valor; 10. }
  • 127.
    1. int calcularEntrada(intvalor) { 2. if (estudante) { 3. if (temCarteirinha && naoEhFalsa) { 4. 5. return valor * 0.5; 6. 7. } 8. } 9. return valor; 10. }
  • 128.
    1. int calcularEntrada(intvalor) { 2. if (estudante) { 3. if (temCarteirinha && naoEhFalsa) { 4. return valor * 0.5; 5. } 6. } 7. return valor; 8. }
  • 129.
    1. int calcularEntrada(intvalor) { 2. if (estudante) { 3. if (temCarteirinha && naoEhFalsa) { 4. return valor * 0.5; 5. } 6. } 7. return valor; 8. }
  • 130.
    1. int calcularEntrada(intvalor) { 2. if (estudante) { 3. 4. return valor * 0.5; 5. 6. } 7. return valor; 8. }
  • 131.
    1. int calcularEntrada(intvalor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. 4. return valor * 0.5; 5. 6. } 7. return valor; 8. }
  • 132.
    1. int calcularEntrada(intvalor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 133.
    1. int calcularEntrada(intvalor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 134.
    1. int calcularEntrada(intvalor) { 2. if () { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 135.
    1. int calcularEntrada(intvalor) { 2. if (aptoAPagarMeiaEntrada()) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 136.
    1. int calcularEntrada(intvalor) { 2. if (aptoAPagarMeiaEntrada()) { 3. return valor * 0.5; 4. } 5. return valor; 6. } 7. 8. boolean aptoAPagarMeiaEntrada() { 9. return estudante && temCarteirinha && naoEhFalsa; 10. }
  • 137.
    1. int calcularEntrada(intvalor) { 2. if (aptoAPagarMeiaEntrada()) return valor * 0.5; 3. return valor; 4. } 5. 6. boolean aptoAPagarMeiaEntrada() { 7. return estudante && temCarteirinha && naoEhFalsa; 8. }
  • 138.
  • 139.
    O mesmo fragmentode código aparece duplicado em todos os remos de uma expressão condicional. Mova-os para fora da expressão.
  • 140.
    1. public voidsendRequest(Object data) { 2. if (data == null) { 3. resource.send(); 4. } else { 5. resource.setData(data); 6. resource.send(); 7. } 8. }
  • 141.
    1. public voidsendRequest(Object data) { 2. if (data == null) { 3. resource.send(); 4. } else { 5. resource.setData(data); 6. resource.send(); 7. } 8. }
  • 142.
    1. public voidsendRequest(Object data) { 2. if (data == null) { 3. } else { 4. resource.setData(data); 5. } 6. }
  • 143.
    1. public voidsendRequest(Object data) { 2. if (data == null) { 3. } else { 4. resource.setData(data); 5. } 6. resource.send(); 7. }
  • 144.
    1. public voidsendRequest(Object data) { 2. if (data != null) { 3. } else { 4. resource.setData(data); 5. } 6. resource.send(); 7. }
  • 145.
    1. public voidsendRequest(Object data) { 2. if (data != null) { 3. resource.setData(data); 4. } 5. resource.send(); 6. }
  • 146.
    1. public voidsendRequest(Object data) { 2. if (data != null) resource.setData(data); 3. resource.send(); 4. }
  • 147.
  • 148.
    Um método temlógica condicional que não deixa claro o fluxo normal da execução. Use cláusulas-guarda para todos os casos especiais.
  • 149.
    1. public booleanfecharCaixa() { 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 booleanfecharCaixa() { 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. }
  • 151.
    1. public booleanfecharCaixa() { 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. }
  • 152.
    1. public booleanfecharCaixa() { 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 booleanfecharCaixa() { 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. }
  • 154.
    1. public booleanfecharCaixa() { 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. }
  • 155.
    1. public booleanfecharCaixa() { 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 booleanfecharCaixa() { 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 booleanfecharCaixa() { 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 booleanfecharCaixa() { 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. }
  • 159.
    1. public booleanfecharCaixa() { 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. }
  • 160.
    1. public booleanfecharCaixa() { 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 booleanfecharCaixa() { 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. }
  • 162.
    1. public booleanfecharCaixa() { 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. }
  • 163.
    1. public booleanfecharCaixa() { 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 booleanfecharCaixa() { 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 booleanfecharCaixa() { 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 booleanfecharCaixa() { 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. }
  • 167.
    1. public booleanfecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. }
  • 168.
    1. public booleanfecharCaixa() { 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 booleanfecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (!dataDeAberturaDoCaixa.equals(hoje)) { 5. } 6. transferirDinheiroParaContaBancaria(saldo); 7. }
  • 170.
    1. public booleanfecharCaixa() { 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. }
  • 171.
    1. public booleanfecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if () { 5. throw new DataRetroativaException(); 6. } 7. transferirDinheiroParaContaBancaria(saldo); 8. }
  • 172.
    1. public booleanfecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataRetroativa) { 5. throw new DataRetroativaException(); 6. } 7. transferirDinheiroParaContaBancaria(saldo); 8. }
  • 173.
    1. public booleanfecharCaixa() { 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 booleanfecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataRetroativa) throw new DataRetroativaException(); 5. transferirDinheiroParaContaBancaria(saldo); 6. }
  • 175.
    1. public booleanfecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataRetroativa) throw new DataRetroativaException(); 5. transferirDinheiroParaContaBancaria(saldo); 6. }
  • 176.
  • 177.
    Você tem umcomando 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.
  • 178.
    1. public voidemitirExtrato(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. }
  • 179.
    E se houverum novo tipo de extrato?
  • 180.
    1. public voidemitirExtrato(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. }
  • 181.
    1. public voidemitirExtrato(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. }
  • 182.
    1. public voidemitirExtrato(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. }
  • 183.
    Este método tendeao infinito...
  • 184.
    1. public voidemitirExtrato(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. }
  • 185.
    1. public abstractclass 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. }
  • 186.
    1. public voidemitirExtrato(String tipo) { 2. Extrato.criarExtrato(tipo).emitir(); 3. }
  • 187.
  • 188.
    Você tem umif apenas para decidir qual atribuição realizar. Utilize um comando ternário.
  • 189.
  • 190.
    1. public voidcalcularImposto(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 voidcalcularImposto(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. }
  • 192.
    1. public voidcalcularImposto(int valor) { 2. int imposto = 3. return imposto; 4. }
  • 193.
    1. public voidcalcularImposto(int valor) { 2. int imposto = (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. return imposto; 4. }
  • 194.
    1. public voidcalcularImposto(int valor) { 2. int imposto = (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. return imposto; 4. }
  • 195.
    1. public voidcalcularImposto(int valor) { 2. return (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. }
  • 196.
  • 197.
    Você tem umternário aninhado que se tornou complexo de entender. Mude o ternário para um if.
  • 198.
    1. public voidcalcularImposto(int valor) { 2. return (valor > 1000) ? (valor < 10000) ? valor * 0.05 : valor * 0.10 : valor * 0.02; 3. }
  • 199.
  • 200.
  • 201.
    Você tem umaclasse, 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.
  • 202.
    1. public classSecurity { 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 classSecurity { 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. }
  • 204.
    1. public classSecurity { 2. 3. public Security() { 4. } 5. 6. public boolean verifyUser(User user) { 7. // Código que valida o usuário. 8. } 9. }
  • 205.
    1. public classSecurity { 2. 3. public Security() { 4. 5. } 6. 7. public boolean verifyUser(User user) { 8. // Código que valida o usuário. 9. } 10. }
  • 206.
    1. public classSecurity { 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. }
  • 207.
    1. public classSecurityRulesLoader { 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. }
  • 208.
  • 209.
    Uma classe referenciauma outra classe delegada por um objeto. Crie métodos no servidor para ocultar a delegação.
  • 210.
    1. // Códigoda 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ódigoda 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. }
  • 212.
    1. // Códigoda classe PaperBoy… 2. double valorAPagar = 2.00; 3. if () { 4. 5. } else { 6. // Volte quando tiver dinheiro para pagar… 7. }
  • 213.
    1. // Códigoda 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. }
  • 214.
  • 215.
    Você tem muitosconstrutores que fazem coisas diferentes. Utilize métodos fábrica para tornar a construção mais intuitiva.
  • 216.
    1. public classTriangulo { 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. }
  • 217.
    1. public classTriangulo { 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. }
  • 218.
    1. public classTriangulo { 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. }
  • 219.
    1. public classTriangulo { 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. }
  • 220.
    1. public classTriangulo { 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. }
  • 221.
    1. public classTriangulo { 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. }
  • 222.
    1. public classTriangulo { 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. }
  • 223.
    1. public classTriangulo { 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. }
  • 224.
    1. public classTriangulo { 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. }
  • 225.
    1. public classTriangulo { 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. }
  • 226.
    1. public classTriangulo { 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. }
  • 227.
    1. public classTriangulo { 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. }
  • 228.
    1. public classTriangulo { 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. }
  • 229.
    1. public classTriangulo { 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. }
  • 230.
    1. public classTriangulo { 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 classTriangulo { 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. }
  • 232.
    1. public classTriangulo { 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. }
  • 233.
    1. public classTriangulo { 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. }
  • 234.
    1. public classTriangulo { 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. }
  • 235.
  • 236.
    Você tem doismé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.
  • 237.
    1. public classCafe { 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. }
  • 238.
    1. public classCha { 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. }
  • 239.
    1. public classCafe { 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. }
  • 240.
    1. public classCha { 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. }
  • 241.
    1. public abstractclass 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. }
  • 242.
    1. public classCafé 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. }
  • 243.
    1. public classCha 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. }
  • 244.
  • 245.
    Você tem umswitch ou aninhamento de condicional e não quer criar um conjunto de classes. Utilize um enum com strategy para absorver o polimorfismo.
  • 246.
    1. public classBanco { 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. }
  • 247.
    1. public enumTipoExtrato { 2. SimplificadoMensal, 3. SimplificadoQuinzenal, 4. SimplificadoSemanal, 5. Completo; 6. }
  • 248.
    1. public enumTipoExtrato { 2. SimplificadoMensal, 3. SimplificadoQuinzenal, 4. SimplificadoSemanal, 5. Completo; 6. 7. public abstract void emitirExtrato(); 8. }
  • 249.
    1. public enumTipoExtrato { 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. }
  • 250.
    1. public classBanco { 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. }
  • 251.
    1. public classBanco { 2. 3. public void emitirExtrato(String tipo) { 4. } 5. 6. }
  • 252.
    1. public classBanco { 2. 3. public void emitirExtrato(String tipo) { 4. TipoExtrato.valueOf(tipo).emitir(); 5. } 6. 7. }
  • 253.
  • 254.
    Você tem construtoresque recebem muitos parâmetros e alguns deles são opcionais. Utilize uma Fluent Interface para flexibilizar a criação dos objetos.
  • 255.
    1. new EmailMessage() 2..from(“rodrigo.branas@gmail.com”) 3. .to(“contato@globo.com”) 4. .withSubject(“Fluent API - Demo”) 5. .withMessage(“Message…”) 6. .send();
  • 256.
    1. Date data= november(20, 2005);
  • 257.
    1. new Image(“cat.jpg”) 2..rotate(90) 3. .watermark(“Copyright - 2012”) 4. .blackAndWhite() 5. .save(“catAfterChanges.jpg”);
  • 258.
  • 259.
    Um método retornauma coleção. Faça-o retornar uma visão apenas de leitura e forneça métodos de adição e remoção.
  • 260.
    1. ... 2. Bibliotecabiblioteca = 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. ...
  • 261.
    1. public classBiblioteca { 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 classBiblioteca { 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. }
  • 263.
    1. public classBiblioteca { 2. 3. private Set<Livro> livros; 4. 5. }
  • 264.
    1. public classBiblioteca { 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. }
  • 265.
    1. ... 2. Bibliotecabiblioteca = 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. ...
  • 266.
  • 267.
  • 268.
    Você está lançandouma exceção genérica Tente lançar exceções específicas
  • 269.
    1. public voidcalcularImposto(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 voidcalcularImposto(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. }
  • 271.
    1. public voidcalcularImposto(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. }
  • 272.
    1. public voidcalcularImposto(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. }
  • 273.
    Evite tratar exceçõesde forma genérica
  • 274.
    Você possui umbloco catch tratando exceções genéricas Utilize exceções específicas
  • 275.
    1. try { 2.// Código que lança a exceção. 3. } catch (Exception e) { 4. // Código de tratamento da exceção 5. }
  • 276.
    1. try { 2.// Código que lança a exceção. 3. } catch (Throwable e) { 4. // Código de tratamento da exceção 5. }
  • 277.
  • 278.
    Você possui umbloco catch vazio Avalie se faz sentido continuar utilizando uma exceção verificada (checked)
  • 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. 5. }
  • 281.
    1. try { 2.// Código que lança a exceção. 3. } catch (SomeException e) { 4. e.printStacktrace(); 5. }
  • 282.
  • 283.
    Existem exceções sendolançadas sem uma mensagem contendo a explicação detalhada da falha Define uma mensagem detalhando a falha
  • 284.
    1. public voidgerarBoleto(Boleto boleto) throws BoletoException { 2. // Código de geração do boleto 3. throw new BoletoException(); 4. }
  • 285.
    1. public voidgerarBoleto(Boleto boleto) throws BoletoException { 2. // Código de geração do boleto 3. throw new BoletoException(boleto); 4. }
  • 286.
    1. public voidgerarBoleto(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. }
  • 287.
    Substituir Código deErro por Exceção
  • 288.
    Um método retornaum código especial para indicar um erro. Em vez disso, gere uma exceção.
  • 289.
    1. public classCaixaEletronico { 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 classCaixaEletronico { 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. }
  • 291.
    1. public classCaixaEletronico { 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. }
  • 292.
    1. public classCaixaEletronico { 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 classCaixaEletronico { 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. }
  • 294.
    1. public classCaixaEletronico { 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. }
  • 295.
    1. public classCaixaEletronico { 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. }
  • 296.
    Que tipo deexceção utilizar nesse cenário?
  • 297.
    1. public classCaixaEletronico { 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. }
  • 298.
    1. public classCaixaEletronico { 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 classCaixaEletronico { 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. }
  • 300.
    1. public classCaixaEletronico { 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. }
  • 301.
    1. public classCaixaEletronico { 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 classCaixaEletronico { 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 classCaixaEletronico { 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. }
  • 304.
    1. public classCaixaEletronico { 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. }
  • 305.
  • 306.
    Você está gerandouma exceção em uma condição que o solicitante poderia ter verificado primeiro. Faça o teste primeiro.
  • 307.
    1. public classConnectionPool { 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 classConnectionPool { 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. }
  • 309.
    1. public classConnectionPool { 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. }
  • 310.
    1. public classConnectionPool { 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. }
  • 311.
    1. public classConnectionPool { 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. }
  • 312.
    1. public classConnectionPool { 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. }
  • 313.
    1. public classConnectionPool { 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 classConnectionPool { 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 classConnectionPool { 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. }
  • 316.
    1. public classConnectionPool { 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. }
  • 317.
    1. public classConnectionPool { 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. }
  • 318.
    1. public classConnectionPool { 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. }
  • 319.
    1. public classConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. if (available.isEmpty()) return new Connection(); 6. return (Connection) available.pop(); 7. } 8. }
  • 320.
    1. public classConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. return (available.isEmpty()) ? new Connection() : (Connection) available.pop(); 6. } 7. }
  • 321.
    Prefira o usode exceções padrão da linguagem
  • 322.
    Você pode utilizaruma das exceção padrão da linguagem para tratar um cenário específico Substitua a exceção customizada pela padrão da linguagem
  • 323.
    1. public voidconverterVideo(Video video) { 2. if(video == null) { 3. throw new VideoInvalidoException(); 4. } 5. // Código da conversão do video 6. }
  • 324.
    Principais exceções dalinguagem: IllegalArgumentException IllegalStateException NullPointerException IndexOutOfBoundsException UnsupportedOperationException
  • 325.
    1. public voidconverterVideo(Video video) { 2. if(video == null) { 3. throw new VideoInvalidoException(); 4. } 5. // Código da conversão do video 6. }
  • 326.
    1. public voidconverterVideo(Video video) { 2. if(video == null) { 3. throw new (); 4. } 5. // Código da conversão do video 6. }
  • 327.
    1. public voidconverterVideo(Video video) { 2. if(video == null) { 3. throw new IllegalArgumentException(); 4. } 5. // Código da conversão do video 6. }
  • 328.
    Exceção no nívelde abstração inadequado
  • 329.
    Exceções de camadasinferiores 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
  • 330.
    1. public classCadastroGUI { 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. }
  • 331.
    1. public classCadastroGUI { 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. }
  • 332.
    1. public classCadastroGUI { 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. }
  • 333.
    1. public classCadastroGUI { 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. }
  • 334.
  • 335.
    Você está tratandoexceçõ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)
  • 336.
    1. public voidtratarConteudoDoArquivo(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. }
  • 337.
    1. public classFileReader { 2. }
  • 338.
    1. public classFileReader { 2. public byte[] readFile(String path) { 3. } 4. }
  • 339.
    1. public classFileReader { 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. }
  • 340.
    1. public classFileReader { 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. }
  • 341.
    1. public classFileReader { 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. }
  • 342.
    1. public classFileReader { 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. }
  • 343.
    1. public voidtratarConteudoDoArquivo(String path) { 2. byte[] conteudo = FileReader.readFile(path); 3. for(byte eachByte : conteudo) { 4. // Código de tratamento do conteúdo 5. } 6. }
  • 344.
    1. public voidtratarConteudoDoArquivo(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. }
  • 345.
    1. public voidtratarConteudoDoArquivo(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. }
  • 346.
    1. public voidtratarConteudoDoArquivo(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. }