1. IF BOM É IF MORTO
Refatoração de código com o pattern Strategy
Jackson Veroneze - jackson@jacksonveroneze.com
Mario Mendonça - mario.mendonca@gmail.com
2. Cenário Imagine que o Governo possua um sistema que calcula
o valor dos impostos de receitas vindas de diversas
fontes.
3. Codificação
public class CalculadorDeImpostos {
public double calculaImposto(double receita, String
tipoDeImposto) {
double imposto = 0;
if (tipoDeImposto.equals("IPI"))
imposto = receita * 0.15;
else if (tipoDeImposto.equals("ISS"))
imposto = receita * 0.06;
else if (tipoDeImposto.equals("ICMS"))
imposto = receita * 0.08;
return imposto;
}
}
4. Problema Enorme quantidade de IFs que a classe possui.
Tende a crescer à medida que novos impostos vão
sendo criados, gerando mais complexidade ao código.
5. Problema
public class CalculadorDeImpostos {
public double calculaImposto(double receita, String tipoDeImposto) {
double imposto = 0;
if (tipoDeImposto.equals("IPI"))
imposto = receita * 0.15;
else if (tipoDeImposto.equals("ISS"))
imposto = receita * 0.06;
else if (tipoDeImposto.equals("ICMS"))
imposto = receita * 0.08;
else if (tipoDeImposto.equals("IR"))
imposto = receita * 0.03;
else if (tipoDeImposto.equals("IOF"))
imposto = receita * 0.02;
else if (tipoDeImposto.equals("IPVA"))
imposto = receita * 0.05;
else if (tipoDeImposto.equals("CPMF"))
imposto = receita * 0.03;
else if (tipoDeImposto.equals("IPTU"))
imposto = receita * 0.07;
else if (tipoDeImposto.equals("ITR"))
imposto = receita * 0.07;
return imposto;
}
}
10. SOLUÇÃO O padrão Strategy permite que você crie novos objetos
(ex: "IPTU", "IPVA", etc) de um mesmo grupo (ex:
"Impostos"), sem alterar a classe com a qual opera (ex:
"Calculador de Impostos").
12. 2º passo
public class IPI implements Imposto {
public double calculaImposto(double receita) {
return receita * 0.15;
}
}
public class ISS implements Imposto {
public double calculaImposto(double receita) {
return receita * 0.06;
}
}
public class ICMS implements Imposto {
public double calculaImposto(double receita) {
return receita * 0.08;
}
}
13. 3º passo public class CalculadorDeImpostos {
public double calculaImposto(double receita,
Imposto imposto) {
return imposto.calculaImposto(receita);
}
}
14. Teste do padrão
package br.eti.arquiteturacomputacional;
public class RealizaBalancoFinanceiro {
public static void main(String[] args) {
CalculadorDeImpostos calculador = new CalculadorDeImpostos();
//Calcula o imposto ICMS
Imposto icms = new ICMS();
double impostoAReceber = calculador.calculaImposto(500, icms);
System.out.println("ICMS de 500 = " + impostoAReceber);
//Calcula o imposto ISS
Imposto iss = new ISS();
impostoAReceber = calculador.calculaImposto(500, iss);
System.out.println("ISS de 500 = " + impostoAReceber);
}
}
15. Conclusão Podemos criar novos impostos, sem alterar qualquer
código existente. Esse padrão chama-se Strategy
porque entregamos uma estratégia (um imposto
especializado) para um contexto
(CalculadorDeImpostos).