Fala galera! Tudo certo?
Esse caso é bem simples, porém bastante rotineiro, vocês já se atentaram na ordem que colocam as condições em seus IFs? Pode ser que consigam ganhar ou perder performance com isso, bora ver?!
Na situação em questão, precisaríamos verificar se:
- O cliente está ativo, ou
- A última compra que ele fez foi de mais de R$ 10.000,00
Pra ficar bem didático,
Havia uma classe chamada “Cliente” que era basicamente assim:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Cliente | |
{ | |
public int Id { get; set } | |
public bool Ativo { get; set; } | |
//Outros atributos… | |
} |
e a classe que verifica isso estava mais ou menos assim:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class AprovarComprasDoCliente | |
{ | |
public bool VerificarSeClientePodeComprar(int idCliente) | |
{ | |
var cliente = _repositorio.BuscarCliente(idCliente); | |
//algumas verificações aqui… | |
if(VerificaUltimaCompra(cliente) || cliente.Ativo) | |
{ | |
//Outras coisas aqui… | |
return true; | |
} | |
return false; | |
} | |
private bool VerificaUltimaCompra(Cliente cliente) | |
{ | |
//Operações utilizando banco de dados ou requisições para outras APIs | |
} | |
} |
Estava funcionando? Sim!
Mas não era a melhor maneira, e já vou explicar o motivo.
Verifiquem que temos uma condição OU ( || ) dentro do IF, certo? Ou seja, se qualquer uma das condições for igual a VERDADEIRO, o código dentro do bloco irá executar. Então se o cliente estiver ativo ou se a última compra for maior que R$ 10.000,00 o código dentro do bloco IF irá executar.
Quando temos uma condição OU ( || ) dentro de um IF, as verificações são feitas em ordem, e quando uma das verificações retorna VERDADEIRO, o restante das verificações NÃO é executada.
Nesse caso, a primeira verificação é a das compras, mas reparem que essa verificação é um método, que faz uso do banco de dados e de requisições para APIs externas, enquanto a segunda verificação é somente se um atributo da classe que já foi instanciada e utilizada anteriormente é VERDADEIRO.
Pensem, o que é mais custoso? Verificar se um atributo é VERDADEIRO ou fazer requisições de API e banco de dados?
E se o atributo “Ativo” for igual a VERDADEIRO, nós sempre vamos fazer um trabalhão desnecessário.
O ajuste nesse caso, é só inverter a verificação dentro do IF, pra ficar assim:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class AprovarComprasDoCliente | |
{ | |
public bool VerificarSeClientePodeComprar(int idCliente) | |
{ | |
var cliente = _repositorio.BuscarCliente(idCliente); | |
//algumas verificações aqui… | |
//Agora verificamos o "Ativo" primeiro 🙂 | |
if(cliente.Ativo || VerificaUltimaCompra(cliente)) | |
{ | |
//Outras coisas aqui… | |
return true; | |
} | |
return false; | |
} | |
private bool VerificaUltimaCompra(Cliente cliente) | |
{ | |
//Operações utilizando banco de dados ou requisições para outras APIs | |
} | |
} |
Com uma mudança bem simples, conseguimos diminuir o custo de requisições no banco de dados e APIs externas.
Show?
Os códigos utilizados estão disponíveis no GitHub: https://github.com/vmussak/CasosDaVidaReal
Por hoje é só isso, qualquer dúvida ou sugestão, estou à disposição! Até mais 😀