SlideShare uma empresa Scribd logo
1 de 346
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.
Técnicas de Refactoring
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. }

Mais conteúdo relacionado

Mais procurados

AngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivasAngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivasJanderson Fernandes Cardoso
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJSRodrigo Branas
 
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Rafael Ponte
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Julian Cesar
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN StackBruno Catão
 
RubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoRubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
AngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideAngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideSergio Azevedo
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHPigorpimentel
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + FirebaseBruno Catão
 
Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicosponto hacker
 

Mais procurados (20)

AngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivasAngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivas
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJS
 
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
Os 10 maus habitos dos desenvolvedores jsf (JustJava e CCT)
 
Angular js
Angular jsAngular js
Angular js
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
 
Android na Prática
Android na PráticaAndroid na Prática
Android na Prática
 
Python 06
Python 06Python 06
Python 06
 
Java script aula 02 - operadores
Java script   aula 02 - operadoresJava script   aula 02 - operadores
Java script aula 02 - operadores
 
Python 07
Python 07Python 07
Python 07
 
Java script aula 08 - formulários
Java script   aula 08 - formuláriosJava script   aula 08 - formulários
Java script aula 08 - formulários
 
Java script - funções
Java script - funçõesJava script - funções
Java script - funções
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
 
RubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoRubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direito
 
AngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideAngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-Side
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHP
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + Firebase
 
JavaScript - A Linguagem
JavaScript - A LinguagemJavaScript - A Linguagem
JavaScript - A Linguagem
 
Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicos
 
Java script aula 10 - angularjs
Java script   aula 10 - angularjsJava script   aula 10 - angularjs
Java script aula 10 - angularjs
 
Introdução ao JQuery e AJAX
Introdução ao JQuery e AJAXIntrodução ao JQuery e AJAX
Introdução ao JQuery e AJAX
 

Destaque

Test-Driven Development com JavaScript, Jasmine Karma
Test-Driven Development com JavaScript, Jasmine  KarmaTest-Driven Development com JavaScript, Jasmine  Karma
Test-Driven Development com JavaScript, Jasmine KarmaRodrigo Branas
 
Node.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasRodrigo Branas
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasRodrigo Branas
 
Criando Filtros com AngularJS
Criando Filtros com AngularJSCriando Filtros com AngularJS
Criando Filtros com AngularJSRodrigo Branas
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSRodrigo Branas
 
JavaScript - Expressões Regulares
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões RegularesRodrigo Branas
 
Utilizando diretivas com AngularJS
Utilizando diretivas com AngularJSUtilizando diretivas com AngularJS
Utilizando diretivas com AngularJSRodrigo Branas
 
Criando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJSCriando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJSRodrigo Branas
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJSRodrigo Branas
 

Destaque (13)

Selenium - WebDriver
Selenium - WebDriverSelenium - WebDriver
Selenium - WebDriver
 
Test-Driven Development com JavaScript, Jasmine Karma
Test-Driven Development com JavaScript, Jasmine  KarmaTest-Driven Development com JavaScript, Jasmine  Karma
Test-Driven Development com JavaScript, Jasmine Karma
 
#2 - Git - DAG
#2 - Git - DAG#2 - Git - DAG
#2 - Git - DAG
 
Node.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo BranasNode.js - #5 - Process - Rodrigo Branas
Node.js - #5 - Process - Rodrigo Branas
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
 
JavaScript - Date
JavaScript - DateJavaScript - Date
JavaScript - Date
 
Scope AngularJS
Scope AngularJSScope AngularJS
Scope AngularJS
 
Criando Filtros com AngularJS
Criando Filtros com AngularJSCriando Filtros com AngularJS
Criando Filtros com AngularJS
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJS
 
JavaScript - Expressões Regulares
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões Regulares
 
Utilizando diretivas com AngularJS
Utilizando diretivas com AngularJSUtilizando diretivas com AngularJS
Utilizando diretivas com AngularJS
 
Criando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJSCriando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJS
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJS
 

Semelhante a Técnicas de Refactoring

Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Giovanni Bassi
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo MenezesGrafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo MenezesJulio Menezes
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsDiego Castro
 
Desmistificando o cairngorm
Desmistificando o cairngormDesmistificando o cairngorm
Desmistificando o cairngormEric Cavalcanti
 
Testes Unitários com GTest e Catch
Testes Unitários com GTest e CatchTestes Unitários com GTest e Catch
Testes Unitários com GTest e CatchUilian Ries
 
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresTDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresFernando Franquini
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaEduardo Bregaida
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasRodrigo Branas
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersHarlley Oliveira
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 

Semelhante a Técnicas de Refactoring (20)

Refactoring
RefactoringRefactoring
Refactoring
 
Apresentando o EcmaScript 6
Apresentando o EcmaScript 6Apresentando o EcmaScript 6
Apresentando o EcmaScript 6
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo MenezesGrafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
Grafos e Algoritimos - Dr. Julio Cesar de Araujo Menezes
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
 
Desmistificando o cairngorm
Desmistificando o cairngormDesmistificando o cairngorm
Desmistificando o cairngorm
 
Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2
 
Vraptor
VraptorVraptor
Vraptor
 
Testes Unitários com GTest e Catch
Testes Unitários com GTest e CatchTestes Unitários com GTest e Catch
Testes Unitários com GTest e Catch
 
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresTDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
 
Clean code
Clean codeClean code
Clean code
 
API Apontador
API ApontadorAPI Apontador
API Apontador
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 

Mais de Rodrigo Branas

Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasRodrigo Branas
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasRodrigo Branas
 
#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisasRodrigo Branas
 
#1 - Git - Introdução
#1 - Git - Introdução#1 - Git - Introdução
#1 - Git - IntroduçãoRodrigo Branas
 
#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remotoRodrigo Branas
 
#3 - Git - Branching e Merging
#3 - Git - Branching e Merging#3 - Git - Branching e Merging
#3 - Git - Branching e MergingRodrigo Branas
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptRodrigo Branas
 

Mais de Rodrigo Branas (11)

Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo Branas
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
 
#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas#6 - Git - Desfazendo as coisas
#6 - Git - Desfazendo as coisas
 
#1 - Git - Introdução
#1 - Git - Introdução#1 - Git - Introdução
#1 - Git - Introdução
 
#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto#5 - Git - Contribuindo com um repositório remoto
#5 - Git - Contribuindo com um repositório remoto
 
#4 - Git - Stash
#4 - Git - Stash#4 - Git - Stash
#4 - Git - Stash
 
#3 - Git - Branching e Merging
#3 - Git - Branching e Merging#3 - Git - Branching e Merging
#3 - Git - Branching e Merging
 
Grunt
GruntGrunt
Grunt
 
Bower
BowerBower
Bower
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScript
 

Técnicas de Refactoring

  • 1. Técnicas de Refactoring Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br
  • 2. “Transformar equipes de desenvolvimento de software” http://www.agilecode.com.br
  • 3. Rodrigo Branas rodrigo.branas@agilecode.com.br http://www.agilecode.com.br • Desenvolvendo Software na Gennera • Criando treinamentos na Agile Code • Escrevendo na Java Magazine e PacktPub • Palestrando sobre desenvolvimento de software em eventos, universidades e empresas
  • 4. Certificações Formação Acadêmica Ciências da Computação – UFSC Gerenciamento de Projetos - FGV SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM Experiência Há mais de 12 anos desenvolvendo software na plataforma Java com as empresas: EDS, HP, NET, Citibank, GM, Dígitro, Softplan, OnCast, Senai, VALE, RBS, Unimed, Globalcode, V.Office, Suntech, WPlex e Gennera.
  • 5. • Há mais de 5 anos liderando pessoas. • Mais de 2000 horas em sala de aula. • Mais de 100 apresentações em eventos. • 6 artigos escritos para revistas. • 1 livro. • Mais de 500 profissionais treinados. • Criação de 22 palestras. • Criação de 10 treinamentos. • Criação de mais de 3.000 slides.
  • 8. Existe um fragmento de código que poderia ser agrupado para tornar a lógica mais fácil de ser entendida. Transforme esse fragmento em um método cujo nome explique o propósito do mesmo.
  • 9. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. System.out.println(“--------------------------------”); 4. System.out.println(“EXTRATO – SANTANDER”); 5. System.out.println(“--------------------------------”); 6. // imprimir detalhes 7. System.out.println(“NOME:” + nomeDoCliente); 8. for(Lancto lancto : getLanctos(periodo)) { 9. System.out.println(lancto); 10. } 11. System.out.println(“SALDO:” + saldoTotal); 12. // imprimir rodapé 13. System.out.println(“--------------------------------”); 14. System.out.println(getDataEHoraAtual()); 15. }
  • 10. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. System.out.println(“--------------------------------”); 4. System.out.println(“EXTRATO – SANTANDER”); 5. System.out.println(“--------------------------------”); 6. // imprimir detalhes 7. System.out.println(“NOME:” + nomeDoCliente); 8. for(Lancto lancto : getLanctos(periodo)) { 9. System.out.println(lancto); 10. } 11. System.out.println(“SALDO:” + saldoTotal); 12. // imprimir rodapé 13. System.out.println(“--------------------------------”); 14. System.out.println(getDataEHoraAtual()); 15. }
  • 11. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. 4. // imprimir detalhes 5. System.out.println(“NOME:” + nomeDoCliente); 6. for(Lancto lancto : getLanctos(periodo)) { 7. System.out.println(lancto); 8. } 9. System.out.println(“SALDO:” + saldoTotal); 10. // imprimir rodapé 11. System.out.println(“--------------------------------”); 12. System.out.println(getDataEHoraAtual()); 13. }
  • 12. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. System.out.println(“NOME:” + nomeDoCliente); 6. for(Lancto lancto : getLanctos(periodo)) { 7. System.out.println(lancto); 8. } 9. System.out.println(“SALDO:” + saldoTotal); 10. // imprimir rodapé 11. System.out.println(“--------------------------------”); 12. System.out.println(getDataEHoraAtual()); 13. }
  • 13. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. System.out.println(“NOME:” + nomeDoCliente); 6. for(Lancto lancto : getLanctos(periodo)) { 7. System.out.println(lancto); 8. } 9. System.out.println(“SALDO:” + saldoTotal); 10. // imprimir rodapé 11. System.out.println(“--------------------------------”); 12. System.out.println(getDataEHoraAtual()); 13. }
  • 14. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. 6. // imprimir rodapé 7. System.out.println(“--------------------------------”); 8. System.out.println(getDataEHoraAtual()); 9. }
  • 15. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. System.out.println(“--------------------------------”); 8. System.out.println(getDataEHoraAtual()); 9. }
  • 16. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. System.out.println(“--------------------------------”); 8. System.out.println(getDataEHoraAtual()); 9. }
  • 17. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. 8. }
  • 18. 1. public void exibirExtrato(Periodo periodo) { 2. // imprimir cabeçalho 3. imprimirCabecalho(); 4. // imprimir detalhes 5. imprimirDetalhes(periodo); 6. // imprimir rodapé 7. imprimirRodape(); 8. }
  • 19. 1. public void exibirExtrato(Periodo periodo) { 2. 3. imprimirCabecalho(); 4. 5. imprimirDetalhes(periodo); 6. 7. imprimirRodape(); 8. }
  • 20. 1. public void exibirExtrato(Periodo periodo) { 2. imprimirCabecalho(); 3. imprimirDetalhes(periodo); 4. imprimirRodape(); 5. }
  • 21. 1. public void exibirExtrato(Periodo periodo) { 2. imprimirCabecalho(); 3. imprimirDetalhes(periodo); 4. imprimirRodape(); 5. }
  • 24. O corpo do método é tão claro quanto seu nome. Coloque o corpo do método dentro do corpo do que o chama e remova o método.
  • 25. 1. int lerAvaliacao( ) { 2. return (maisDeCincoAtrasos()) ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  • 26. 1. int lerAvaliacao( ) { 2. return (maisDeCincoAtrasos()) ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  • 27. 1. int lerAvaliacao( ) { 2. return () ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  • 28. 1. int lerAvaliacao( ) { 2. return (numeroDeAtrasos > 5) ? 2 : 1; 3. } 4. 5. boolean maisDeCincoAtrasos() { 6. return numeroDeAtrasos > 5; 7. }
  • 29. 1. int lerAvaliacao( ) { 2. return (numeroDeAtrasos > 5) ? 2 : 1; 3. }
  • 32. Você tem uma variável temporária que recebe uma única atribuição de uma expressão simples. Substitua todas as referências a essa variável temporária pela expressão.
  • 33. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return preco > 1000; 4. }
  • 34. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return preco > 1000; 4. }
  • 35. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return > 1000; 4. }
  • 36. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return pedido.getPreco() > 1000; 4. }
  • 37. 1. boolean produtoCaro() { 2. double preco = pedido.getPreco(); 3. return pedido.getPreco() > 1000; 4. }
  • 38. 1. boolean produtoCaro() { 2. return pedido.getPreco() > 1000; 3. }
  • 41. Você tem uma expressão complicada. Coloque a expressão, ou partes dela, em uma variável temporária cujo único objetivo é explicar o seu propósito.
  • 42. 1. double calculaValorDaCorrida() { 2. if (hora > 22:00 || hora < 06:00) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 43. 1. double calculaValorDaCorrida() { 2. if () { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 44. 1. double calculaValorDaCorrida() { 2. if (bandeiraDois) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 45. 1. double calculaValorDaCorrida() { 2. boolean bandeiraDois = hora > 22:00 || hora < 06:00; 3. if (bandeiraDois) { 4. return distancia * 3.90; 5. } else { 6. return distancia * 2.10; 7. } 8. }
  • 47. Alternativa Também é interessante optar por uma extração de método para aumentar a possibilidade de reuso.
  • 48. 1. double calculaValorDaCorrida() { 2. if (hora > 22:00 || hora < 06:00) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 49. 1. double calculaValorDaCorrida() { 2. if () { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 50. 1. double calculaValorDaCorrida() { 2. if (bandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. }
  • 51. 1. double calculaValorDaCorrida() { 2. if (bandeiraDois()) { 3. return distancia * 3.90; 4. } else { 5. return distancia * 2.10; 6. } 7. } 8. boolean bandeiraDois() { 9. return hora > 22:00 || hora < 06:00; 10. }
  • 54. Você tem uma variável temporária que mais de uma vez, recebe uma atribuição. Crie uma variável temporária para cada atribuição.
  • 55. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double temp = pesoDoPote / pesoDaDose; 8. temp = temp * proteinasPorDose; 9. temp = precoPote/temp; 10. return temp; 11. } 12. }
  • 56. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double temp = pesoDoPote / pesoDaDose; 8. temp = temp * proteinasPorDose; 9. temp = precoPote/temp; 10. return temp; 11. } 12. }
  • 57. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double = pesoDoPote / pesoDaDose; 8. temp = * proteinasPorDose; 9. temp = precoPote/temp; 10. return temp; 11. } 12. }
  • 58. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. temp = doses * proteinasPorDose; 9. temp = precoPote/temp; 10. return temp; 11. } 12. }
  • 59. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. temp = doses * proteinasPorDose; 9. temp = precoPote/temp; 10. return temp; 11. } 12. }
  • 60. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. = doses * proteinasPorDose; 9. temp = precoPote/; 10. return temp; 11. } 12. }
  • 61. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. double proteinas = doses * proteinasPorDose; 9. temp = precoPote/proteinas; 10. return temp; 11. } 12. }
  • 62. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. double proteinas = doses * proteinasPorDose; 9. temp = precoPote/proteinas; 10. return temp; 11. } 12. }
  • 63. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. double proteinas = doses * proteinasPorDose; 9. = precoPote/proteinas; 10. return; 11. } 12. }
  • 64. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. double doses = pesoDoPote / pesoDaDose; 8. double proteinas = doses * proteinasPorDose; 9. double precoPorProteina = precoPote/proteinas; 10. return precoPorProteina; 11. } 12. }
  • 65. 1. public class PoteDeWhey { 2. int pesoDoPote; 3. int pesoDaDose; 4. int proteinasPorDose; 5. 6. double calcularPrecoPorProteina(double precoPote) { 7. return getDoses()/getTotalProteinas(); 8. }
  • 68. O código faz atribuições a parâmetros. Utilize uma variável temporária no lugar da atribuição
  • 69. 1. void desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  • 70. 1. void desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  • 71. 1. desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  • 72. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. carrinho.setDesconto(0.10); 4. } 5. }
  • 73. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. 4. } 5. }
  • 74. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. }
  • 75. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. 6. }
  • 76. 1. double desconto(Carrinho carrinho) { 2. if (carrinho.getQuantidadeDeProdutos() > 50) { 3. return 0.10; 4. } 5. return 0.0; 6. }
  • 78. Você tem um número literal com um significado especial. Crie uma constante, nomeie-a de acordo com seu significado e substitua o número por ela.
  • 79. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * 9.81 * altura; 5. } 6. 7. }
  • 80. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * 9.81 * altura; 5. } 6. 7. }
  • 81. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * * altura; 5. } 6. 7. }
  • 82. 1. public class Fisica { 2. 3. double energiaPotencial(double massa, double altura) { 4. return massa * GRAVIDADE * altura; 5. } 6. 7. }
  • 83. 1. public class Fisica { 2. public static final double GRAVIDADE = 9.81; 3. double energiaPotencial(double massa, double altura) { 4. return massa * GRAVIDADE * altura; 5. } 6. 7. }
  • 84. Eclipse: Ctrl + 3, Extract Constant
  • 86. O nome de um método não está revelando seu propósito. Altere o nome do método.
  • 87. 1. public void processar() { 2. // Código para processar 3. }
  • 88. 1. public void () { 2. // Código para processar 3. }
  • 89. 1. public void processarFolhaDePagamento() { 2. // Código para processar folha de pagamento 3. }
  • 91. Você está lendo diverso valores de um objeto e passando esses valores como parâmetros em uma chamada de método. Em vez de fazer isso, envie o objeto inteiro.
  • 92. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(nota1, nota2, nota3, nota4); 8. } 9. }
  • 93. E se houver uma modificação que solicita a inclusão de mais uma nota?
  • 94. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(nota1, nota2, nota3, nota4); 8. } 9. }
  • 95. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. int nota5 = notasParciais.getNota5(); 8. double media = calcularMedia(nota1, nota2, nota3, nota4, nota5); 9. } 10. }
  • 96. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. int nota5 = notasParciais.getNota5(); 8. int nota6 = notasParciais.getNota6(); 9. double media = calcularMedia(nota1, nota2, nota3, nota4, nota5, nota6); 10. } 11. }
  • 97. A tendência é o método crescer...
  • 98. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(nota1, nota2, nota3, nota4); 8. } 9. }
  • 99. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(); 8. } 9. }
  • 100. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(notasParciais); 8. } 9. }
  • 101. 1. public class Boletim { 2. public void renderizarMedia() { 3. int nota1 = notasParciais.getNota1(); 4. int nota2 = notasParciais.getNota2(); 5. int nota3 = notasParciais.getNota3(); 6. int nota4 = notasParciais.getNota4(); 7. double media = calcularMedia(notasParciais); 8. } 9. }
  • 102. 1. public class Boletim { 2. public void renderizarMedia() { 3. double media = calcularMedia(notasParciais); 4. } 5. }
  • 103. 1. public class Boletim { 2. public void renderizarMedia() { 3. double media = calcularMedia(notasParciais); 4. } 5. }
  • 104. Cuidado com o HttpServletRequest
  • 107. Você tem um algoritmo confuso e as refatorações não estão ajudando. Substitua o corpo do método por um novo algoritmo.
  • 111. 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.
  • 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. }
  • 124. Você tem uma sequência de testes com o mesmo resultado. Consolide-os em uma única expressão e extraia-a.
  • 125. 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. }
  • 126. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. if (temCarteirinha) { 4. 5. return valor * 0.5; 6. 7. } 8. } 9. return valor; 10. }
  • 127. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. if (temCarteirinha && naoEhFalsa) { 4. 5. return valor * 0.5; 6. 7. } 8. } 9. return valor; 10. }
  • 128. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. if (temCarteirinha && naoEhFalsa) { 4. return valor * 0.5; 5. } 6. } 7. return valor; 8. }
  • 129. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. if (temCarteirinha && naoEhFalsa) { 4. return valor * 0.5; 5. } 6. } 7. return valor; 8. }
  • 130. 1. int calcularEntrada(int valor) { 2. if (estudante) { 3. 4. return valor * 0.5; 5. 6. } 7. return valor; 8. }
  • 131. 1. int calcularEntrada(int valor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. 4. return valor * 0.5; 5. 6. } 7. return valor; 8. }
  • 132. 1. int calcularEntrada(int valor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 133. 1. int calcularEntrada(int valor) { 2. if (estudante && temCarteirinha && naoEhFalsa) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 134. 1. int calcularEntrada(int valor) { 2. if () { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 135. 1. int calcularEntrada(int valor) { 2. if (aptoAPagarMeiaEntrada()) { 3. return valor * 0.5; 4. } 5. return valor; 6. }
  • 136. 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. }
  • 137. 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. }
  • 139. O mesmo fragmento de código aparece duplicado em todos os remos de uma expressão condicional. Mova-os para fora da expressão.
  • 140. 1. public void sendRequest(Object data) { 2. if (data == null) { 3. resource.send(); 4. } else { 5. resource.setData(data); 6. resource.send(); 7. } 8. }
  • 141. 1. public void sendRequest(Object data) { 2. if (data == null) { 3. resource.send(); 4. } else { 5. resource.setData(data); 6. resource.send(); 7. } 8. }
  • 142. 1. public void sendRequest(Object data) { 2. if (data == null) { 3. } else { 4. resource.setData(data); 5. } 6. }
  • 143. 1. public void sendRequest(Object data) { 2. if (data == null) { 3. } else { 4. resource.setData(data); 5. } 6. resource.send(); 7. }
  • 144. 1. public void sendRequest(Object data) { 2. if (data != null) { 3. } else { 4. resource.setData(data); 5. } 6. resource.send(); 7. }
  • 145. 1. public void sendRequest(Object data) { 2. if (data != null) { 3. resource.setData(data); 4. } 5. resource.send(); 6. }
  • 146. 1. public void sendRequest(Object data) { 2. if (data != null) resource.setData(data); 3. resource.send(); 4. }
  • 147. Remover Condição Aninhada por Cláusulas Guarda
  • 148. 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.
  • 149. 1. public boolean fecharCaixa() { 2. if(!caixaFechado) { 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. } else { 13. return true; 14. } 15. }
  • 150. 1. public boolean fecharCaixa() { 2. if(!caixaFechado) { 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. } else { 13. return true; 14. } 15. }
  • 151. 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. }
  • 152. 1. public boolean fecharCaixa() { 2. if(!caixaFechado) { 3. 4. } 5. if(saldo > 0) { 6. if (dataDeAberturaDoCaixa.equals(hoje)) { 7. transferirDinheiroParaContaBancaria(saldo); 8. } else { 9. throw new DataRetroativaException(); 10. } 11. } else { 12. throw new SaldoNegativoException(); 13. } 14. }
  • 153. 1. public boolean fecharCaixa() { 2. if(caixaFechado) { 3. 4. } 5. if(saldo > 0) { 6. if (dataDeAberturaDoCaixa.equals(hoje)) { 7. transferirDinheiroParaContaBancaria(saldo); 8. } else { 9. throw new DataRetroativaException(); 10. } 11. } else { 12. throw new SaldoNegativoException(); 13. } 14. }
  • 154. 1. public boolean fecharCaixa() { 2. if(caixaFechado) { 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 boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. }
  • 156. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. }
  • 157. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. }
  • 158. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. } else { 10. throw new SaldoNegativoException(); 11. } 12. }
  • 159. 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. }
  • 160. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo > 0) { 4. } 5. if (dataDeAberturaDoCaixa.equals(hoje)) { 6. transferirDinheiroParaContaBancaria(saldo); 7. } else { 8. throw new DataRetroativaException(); 9. } 10. }
  • 161. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) { 4. } 5. if (dataDeAberturaDoCaixa.equals(hoje)) { 6. transferirDinheiroParaContaBancaria(saldo); 7. } else { 8. throw new DataRetroativaException(); 9. } 10. }
  • 162. 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. }
  • 163. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. }
  • 164. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. }
  • 165. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. }
  • 166. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. transferirDinheiroParaContaBancaria(saldo); 6. } else { 7. throw new DataRetroativaException(); 8. } 9. }
  • 167. 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. }
  • 168. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataDeAberturaDoCaixa.equals(hoje)) { 5. } 6. transferirDinheiroParaContaBancaria(saldo); 7. }
  • 169. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (!dataDeAberturaDoCaixa.equals(hoje)) { 5. } 6. transferirDinheiroParaContaBancaria(saldo); 7. }
  • 170. 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. }
  • 171. 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. }
  • 172. 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. }
  • 173. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataRetroativa) throw new DataRetroativaException(); 5. transferirDinheiroParaContaBancaria(saldo); 6. }
  • 174. 1. public boolean fecharCaixa() { 2. if(caixaFechado) return true; 3. if(saldo < 0) throw new SaldoNegativoException(); 4. if (dataRetroativa) throw new DataRetroativaException(); 5. transferirDinheiroParaContaBancaria(saldo); 6. }
  • 175. 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. }
  • 177. 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.
  • 178. 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. }
  • 179. E se houver um novo tipo de extrato?
  • 180. 1. public void emitirExtrato(String tipo) { 2. if(tipo.equals(“SimplificadoMensal”)) { 3. // Código para emissão do extrato simplificado mensal. 4. } else if(tipo.equals(“SimplificadoQuinzenal”)) { 5. // Código para emissão do extrato simplificado quinzenal. 6. } else if(tipo.equals(“SimplificadoSemanal”)) { 7. // Código para emissão do extrato simplificado semanal. 8. } else if(tipo.equals(“Completo”)) { 9. // Código para emissão do extrato completo. 10. } 11. }
  • 181. 1. public void emitirExtrato(String tipo) { 2. if(tipo.equals(“SimplificadoMensal”)) { 3. // Código para emissão do extrato simplificado mensal. 4. } else if(tipo.equals(“SimplificadoQuinzenal”)) { 5. // Código para emissão do extrato simplificado quinzenal. 6. } else if(tipo.equals(“SimplificadoSemanal”)) { 7. // Código para emissão do extrato simplificado semanal. 8. } else if(tipo.equals(“Completo”)) { 9. // Código para emissão do extrato completo. 10. } else if(tipo.equals(“CompletoTrimestral”)) { 11. // Código para emissão do extrato completo trimestral. 12. } 13. }
  • 182. 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. }
  • 183. Este método tende ao infinito...
  • 184. 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. }
  • 185. 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. }
  • 186. 1. public void emitirExtrato(String tipo) { 2. Extrato.criarExtrato(tipo).emitir(); 3. }
  • 188. Você tem um if apenas para decidir qual atribuição realizar. Utilize um comando ternário.
  • 189. (expressão condicional) ? true : false;
  • 190. 1. public void calcularImposto(int valor) { 2. int imposto = 0; 3. if (valor > 1000) { 4. imposto = valor * 0.05; 5. } else { 6. imposto = valor * 0.02; 7. } 8. return imposto; 9. }
  • 191. 1. public void calcularImposto(int valor) { 2. int imposto = 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 void calcularImposto(int valor) { 2. int imposto = 3. return imposto; 4. }
  • 193. 1. public void calcularImposto(int valor) { 2. int imposto = (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. return imposto; 4. }
  • 194. 1. public void calcularImposto(int valor) { 2. int imposto = (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. return imposto; 4. }
  • 195. 1. public void calcularImposto(int valor) { 2. return (valor > 1000) ? valor * 0.05 : valor * 0.02; 3. }
  • 197. Você tem um ternário aninhado que se tornou complexo de entender. Mude o ternário para um if.
  • 198. 1. public void calcularImposto(int valor) { 2. return (valor > 1000) ? (valor < 10000) ? valor * 0.05 : valor * 0.10 : valor * 0.02; 3. }
  • 201. 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.
  • 202. 1. public class Security { 2. private static final String RULES_PATH = “/usr/rules.xml”; 3. 4. public Security() { 5. this.loadRules(RULES_PATH); 6. } 7. 8. private void loadRules(String rulesPath) { 9. // Código que carrega as regras. 10. } 11. 12. public boolean verifyUser(User user) { 13. // Código que valida o usuário. 14. } 15. }
  • 203. 1. public class Security { 2. 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 class Security { 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 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. }
  • 206. 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. }
  • 207. 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. }
  • 209. Uma classe referencia uma outra classe delegada por um objeto. Crie métodos no servidor para ocultar a delegação.
  • 210. 1. // Código da classe PaperBoy… 2. double valorAPagar = 2.00; 3. if (cliente.getCarteira().getTotal() > valorAPagar) { 4. cliente.getCarteira().retirarDinheiro(valorAPagar); 5. } else { 6. // Volte quando tiver dinheiro para pagar… 7. }
  • 211. 1. // Código da classe PaperBoy… 2. double valorAPagar = 2.00; 3. if (cliente.getCarteira().getTotal() > valorAPagar) { 4. cliente.getCarteira().retirarDinheiro(valorAPagar); 5. } else { 6. // Volte quando tiver dinheiro para pagar… 7. }
  • 212. 1. // Código da classe PaperBoy… 2. double valorAPagar = 2.00; 3. if () { 4. 5. } else { 6. // Volte quando tiver dinheiro para pagar… 7. }
  • 213. 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. }
  • 215. Você tem muitos construtores que fazem coisas diferentes. Utilize métodos fábrica para tornar a construção mais intuitiva.
  • 216. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public Triangulo(int tamanho) { 6. this.lado1 = tamanho; 7. this.lado2 = tamanho; 8. this.lado3 = tamanho; 9. } 10. public Triangulo(int tamanho1, int tamanho2) { 11. this.lado1 = tamanho1; 12. this.lado2 = tamanho2; 13. this.lado3 = 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 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. }
  • 218. 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. }
  • 219. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public Triangulo(int tamanho) { 6. this(tamanho, tamanho, tamanho); 7. } 8. public Triangulo(int tamanho1, int tamanho2) { 9. 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 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. }
  • 221. 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. }
  • 222. 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. }
  • 223. 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. }
  • 224. 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. }
  • 225. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public 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 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. }
  • 227. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. 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 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. }
  • 229. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. return new Triangulo(tamanho1, tamanho2, tamanho2); 10. } 11. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 12. this.lado1 = tamanho1; 13. this.lado2 = tamanho2; 14. this.lado3 = tamanho3; 15. } 16. }
  • 230. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. return new Triangulo(tamanho1, tamanho2, tamanho2); 10. } 11. public static criarTrianguloEscaleno(int tamanho1, int tamanho2, int tamanho3) { 12. return new Triangulo(tamanho1, tamanho2, tamanho3); 13. } 14. public Triangulo(int tamanho1, int tamanho2, int tamanho3) { 15. this.lado1 = tamanho1; 16. this.lado2 = tamanho2; 17. this.lado3 = tamanho3; 18. } 19. }
  • 231. 1. public class Triangulo { 2. private int lado1; 3. private int lado2; 4. private int lado3; 5. public static criarTrianguloEquilatero(int tamanho) { 6. return new Triangulo(tamanho, tamanho, tamanho); 7. } 8. public static criarTrianguloIsosceles(int tamanho1, int tamanho2) { 9. return new Triangulo(tamanho1, tamanho2, tamanho2); 10. } 11. public static criarTrianguloEscaleno(int tamanho1, int tamanho2, int tamanho3) { 12. return new Triangulo(tamanho1, tamanho2, tamanho3); 13. } 14. 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 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. }
  • 233. 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. }
  • 234. 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. }
  • 236. 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.
  • 237. 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. }
  • 238. 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. }
  • 239. 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. }
  • 240. 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. }
  • 241. 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. }
  • 242. 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. }
  • 243. 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. }
  • 245. 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.
  • 246. 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. }
  • 247. 1. public enum TipoExtrato { 2. SimplificadoMensal, 3. SimplificadoQuinzenal, 4. SimplificadoSemanal, 5. Completo; 6. }
  • 248. 1. public enum TipoExtrato { 2. SimplificadoMensal, 3. SimplificadoQuinzenal, 4. SimplificadoSemanal, 5. Completo; 6. 7. public abstract void emitirExtrato(); 8. }
  • 249. 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. }
  • 250. 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. }
  • 251. 1. public class Banco { 2. 3. public void emitirExtrato(String tipo) { 4. } 5. 6. }
  • 252. 1. public class Banco { 2. 3. public void emitirExtrato(String tipo) { 4. TipoExtrato.valueOf(tipo).emitir(); 5. } 6. 7. }
  • 254. 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.
  • 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”);
  • 259. 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.
  • 260. 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. ...
  • 261. 1. public class Biblioteca { 2. 3. private Set<Livro> livros; 4. 5. public Set<Livro> getLivros() { 6. return livros; 7. } 8. 9. public void setLivros(Set<Livro> livros) { 10. this.livros = livros; 11. } 12. }
  • 262. 1. public class Biblioteca { 2. 3. private Set<Livro> livros; 4. 5. 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 class Biblioteca { 2. 3. private Set<Livro> livros; 4. 5. }
  • 264. 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. }
  • 265. 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. ...
  • 268. Você está lançando uma exceção genérica Tente lançar exceções específicas
  • 269. 1. public void calcularImposto(int salario) throws Exception { 2. if(salario < 0) { 3. throw new Exception(“Salário não pode ser negativo”); 4. } 5. // Código de cálculo do imposto retido na fonte 6. }
  • 270. 1. public void calcularImposto(int salario) 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 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. }
  • 272. 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. }
  • 273. Evite tratar exceções de forma genérica
  • 274. Você possui um bloco 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. }
  • 278. Você possui um bloco 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. }
  • 283. Existem exceções sendo lançadas sem uma mensagem contendo a explicação detalhada da falha Define uma mensagem detalhando a falha
  • 284. 1. public void gerarBoleto(Boleto boleto) throws BoletoException { 2. // Código de geração do boleto 3. throw new BoletoException(); 4. }
  • 285. 1. public void gerarBoleto(Boleto boleto) throws BoletoException { 2. // Código de geração do boleto 3. throw new BoletoException(boleto); 4. }
  • 286. 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. }
  • 287. Substituir Código de Erro por Exceção
  • 288. Um método retorna um código especial para indicar um erro. Em vez disso, gere uma exceção.
  • 289. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public int processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. return 0; 14. } else { 15. return -1; 16. } 17. } 18. }
  • 290. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public 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 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. }
  • 292. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. return 0; 14. } else { 15. return -1; 16. } 17. } 18. }
  • 293. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. return 0; 14. } else { 15. return -1; 16. } 17. } 18. }
  • 294. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. } else { 14. } 15. } 16. }
  • 295. 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. }
  • 296. Que tipo de exceção utilizar nesse cenário?
  • 297. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) { 11. if (valor <= saldo) { 12. saldo -= valor; 13. } else { 14. throw new SaldoInsuficienteException(); 15. } 16. } 17. }
  • 298. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. int resultado = banco.processarSaque(valor); 4. if (resultado == 0) { 5. dispensarDinheiro(valor); 6. } else if (resultado == -1) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. public class Banco { 10. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 11. if (valor <= saldo) { 12. saldo -= valor; 13. } else { 14. throw new SaldoInsuficienteException(); 15. } 16. } 17. }
  • 299. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. 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 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. }
  • 301. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. try { 4. banco.processarSaque(valor); 5. dispensarDinheiro(valor); 6. } catch(SaldoInsuficienteException e) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. } 10. public class Banco { 11. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 12. if (valor <= saldo) { 13. saldo -= valor; 14. } else { 15. throw new SaldoInsuficienteException(); 16. } 17. } 18. }
  • 302. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. try { 4. banco.processarSaque(valor); 5. dispensarDinheiro(valor); 6. } catch(SaldoInsuficienteException e) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. } 10. public class Banco { 11. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 12. if (valor <= saldo) { 13. saldo -= valor; 14. } else { 15. throw new SaldoInsuficienteException(); 16. } 17. } 18. }
  • 303. 1. public class CaixaEletronico { 2. public void pedidoDeSaque(double valor) { 3. try { 4. banco.processarSaque(valor); 5. dispensarDinheiro(valor); 6. } catch(SaldoInsuficienteException e) { 7. exibirMensagem(“Saldo Insuficiente”); 8. } 9. } 10. public class Banco { 11. public void processarSaque(double valor) throws SaldoInsuficienteEx... { 12. if (valor > saldo) { 13. saldo -= valor; 14. } else { 15. throw new SaldoInsuficienteException(); 16. } 17. } 18. }
  • 304. 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. }
  • 306. Você está gerando uma exceção em uma condição que o solicitante poderia ter verificado primeiro. Faça o teste primeiro.
  • 307. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. try { 7. connection = (Connection) available.pop(); 8. return connection; 9. } catch(EmptyStackException e) { 10. connection = new Connection(); 11. return connection; 12. } 13. } 14. }
  • 308. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. 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 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. }
  • 310. 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. }
  • 311. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. connection = new Connection(); 8. } 9. try { 10. connection = (Connection) available.pop(); 11. return connection; 12. } catch(EmptyStackException e) { 13. return connection; 14. } 15. } 16. }
  • 312. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. connection = new Connection(); 8. return connection; 9. } 10. try { 11. connection = (Connection) available.pop(); 12. return connection; 13. } catch(EmptyStackException e) { 14. } 15. } 16. }
  • 313. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. connection = new Connection(); 8. return connection; 9. } 10. connection = (Connection) available.pop(); 11. return connection; 12. } 13. }
  • 314. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. connection = new Connection(); 8. return connection; 9. } 10. connection = (Connection) available.pop(); 11. return connection; 12. } 13. }
  • 315. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. connection = new Connection(); 8. return connection; 9. } 10. connection = (Connection) available.pop(); 11. return connection; 12. } 13. }
  • 316. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. Connection connection; 6. if (available.isEmpty()) { 7. return new Connection(); 8. } 9. connection = (Connection) available.pop(); 10. return connection; 11. } 12. }
  • 317. 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. }
  • 318. 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. }
  • 319. 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. }
  • 320. 1. public class ConnectionPool { 2. private Stack available; 3. 4. public Connection getConnection() { 5. return (available.isEmpty()) ? new Connection() : (Connection) available.pop(); 6. } 7. }
  • 321. Prefira o uso de exceções padrão da linguagem
  • 322. 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
  • 323. 1. public void converterVideo(Video video) { 2. if(video == null) { 3. throw new VideoInvalidoException(); 4. } 5. // Código da conversão do video 6. }
  • 324. Principais exceções da linguagem: IllegalArgumentException IllegalStateException NullPointerException IndexOutOfBoundsException UnsupportedOperationException
  • 325. 1. public void converterVideo(Video video) { 2. if(video == null) { 3. throw new VideoInvalidoException(); 4. } 5. // Código da conversão do video 6. }
  • 326. 1. public void converterVideo(Video video) { 2. if(video == null) { 3. throw new (); 4. } 5. // Código da conversão do video 6. }
  • 327. 1. public void converterVideo(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ível de abstração inadequado
  • 329. 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
  • 330. 1. public class CadastroGUI { 2. CadastroBusiness cadastroBusiness; 3. 4. public void mostrarCliente(int id) { 5. Cliente cliente; 6. try { 7. cliente = cadastroBusiness.buscarCliente(id); 8. } catch (SQLException e) { 9. // Código de tratamento da exceção 10. } 11. // Código de exibição do cliente 12. } 13. }
  • 331. 1. public class CadastroGUI { 2. CadastroBusiness cadastroBusiness; 3. 4. public void mostrarCliente(int id) { 5. Cliente cliente; 6. try { 7. cliente = cadastroBusiness.buscarCliente(id); 8. } catch (e) { 9. // Código de tratamento 10. } 11. // Código de exibição do cliente 12. } 13. }
  • 332. 1. public class CadastroGUI { 2. CadastroBusiness cadastroBusiness; 3. 4. public void mostrarCliente(int id) { 5. Cliente cliente; 6. try { 7. cliente = cadastroBusiness.buscarCliente(id); 8. } catch (ClienteNaoEncontradoException e) { 9. // Código de tratamento de clientes não encontrados 10. } 11. // Código de exibição do cliente 12. } 13. }
  • 333. 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. }
  • 335. 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)
  • 336. 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. }
  • 337. 1. public class FileReader { 2. }
  • 338. 1. public class FileReader { 2. public byte[] readFile(String path) { 3. } 4. }
  • 339. 1. public class FileReader { 2. public byte[] readFile(String path) { 3. try { 4. File file = new File(path); 5. FileInputStream input = new FileInputStream(file); 6. byte[] conteudo = new byte[input.available()]; 7. input.read(conteudo); 8. return conteudo; 9. } catch (FileNotFoundException e) { 10. } catch (IOException e) { 11. } 12. } 13. }
  • 340. 1. public class FileReader { 2. public byte[] readFile(String path) { 3. try { 4. File file = new File(path); 5. FileInputStream input = new FileInputStream(file); 6. byte[] conteudo = new byte[input.available()]; 7. input.read(conteudo); 8. return conteudo; 9. } catch (FileNotFoundException e) { 10. throw new FileReaderException(e); 11. } catch (IOException e) { 12. } 13. } 14. }
  • 341. 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. }
  • 342. 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. }
  • 343. 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. }
  • 344. 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. }
  • 345. 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. }
  • 346. 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. }