Boa prática SWITCH , IF e MAP

Boa tarde pessoal,

Estou incomodado com um código de um sistema que estou mexendo, estou querendo dar uma melhorada nele, por isso dei uma pesquisada e encontrei diversas matérias dando dicas para substituir IF´s e SWITCH´s pelo uso de Maps e tal… porém, de todos os tópicos que li todos davam exemplo de IF´s simples, ou seja, com apenas um condição, veja o exemplo:

if (produto.getQuantidade()==1) {
   .....
  }else if (produto.getQuantidade()==2) {
   .....
 }else if (produto.getQuantidade()==3) {
   .....
 }else if (produto.getQuantidade()==4) {
   .....
}else{
   .....
}

Muitos dos tópicos que li, sugeriam a utilização de um Map para suprir a utilização de tantos IF´s, eu gostei e estou querendo utilizar, porém me deparei numa situação.

Quando há mais de uma condição nos IF´s, como eu deveria agir? Exemplo:

if (produto.getStatus().equals(Status.ATIVO)  && produto.getQuantidade() ==10 && produto.getCor().equals(Cor.VERDE)) {  
.....
} else   if (produto.getStatus().equals(Status.ATIVO)  && produto.getQuantidade() == 5 && produto.getCor().equals(Cor.AZUL)){
.....
} else   if (produto.getStatus().equals(Status.INATIVO)  && produto.getQuantidade() == 5 && produto.getCor().equals(Cor.PRETO)){
}

Como eu faria a chave do Map? Concatenaria como string ou criaria uma classe somente para representar as condições?

Quando existem muitas condições a ser verificadas, gosto de usar um padrão chamado Specification.
Aprendi isso num fórum com uma postagem do Dr. Heinz Kabutz.
Eu cheguei a criar uma API para regras de negócio reaproveitáveis baseadas no Specification, de repente pode te ser útil: Link aqui

1 curtida

vamos la

antes de mais nada, não existe nada de errado com ifs SE vc inventar moda.

por exemplo se vc faz coisas baseadas na quantidade, provavelmente existe uma razão. o que é mais facil de ler?

if ( quantidade == 1) { 
  desconto = 0.10;
} else if ( quantidade == 2 ) {
  desconto = 0.20;
}

ou

double descontos[] = new double[]{ 0.10 , 0.20 };
...
desconto = descontos[ quantidade - 1 ]; // aqui da pra usar mutretas...

ou

desconto = quantidade * 0.10;

ou

?

faça o que fizer sentido. por exemplo, as regras de descontos podem ser dinamicas e lidas de um arquivo xml, banco de dados ou ate mesmo pode rolar um script javascript.

sobre ifs com varias condicoes, que tal ao inves deproduto.getStatus().equals(Status.ATIVO) vc fazer produto.isAtivo() ?

pense nisso.

Achei esse post no Alura, depois que fui eliminado numa entrevista de trabalho, no ano passado.

reduzindo-de-n-ifs-para-nenhum-com-strategy-em-java

{ },s.

1 curtida

Muito bom @Daniel_Dias!
Particularmente também acho bem melhor utilizar polimorfismo ao invés de if-else.
Esse padrão Specification que citei é basicamente um Strategy com interface fluente.
Dá pra fazer muita coisa com Strategy! :smiley:

1 curtida

Concordo você,
achei a solução da Alura bem interessante, deixou o código com outra cara e com melhor entendimento.
Já Specification também achei muito interessante, ainda mais tendo o seu JavaDoc em português e com um exemplo de sua utilização logo primeira página. :smiley:

{ },s.

1 curtida