Rlangbecker / Ti21-DWII-Pr.Mathias

Created with StackBlitz ⚡️
https://stackblitz.com/edit/node-dek5dl
0 stars 0 forks source link

Correção Exercício `0.1.2` #1

Open mathiasgheno opened 2 years ago

mathiasgheno commented 2 years ago

Correção Exercício 0.1.2

Faça uma função que irá receber três parâmetros. O primeiro será um numero que representa o valor de uma compra que está sendo feita no mercado / farmácia. O segundo parâmetro é um boolean que representa se a compra possui ou não convênio com o estabelecimento e o último parâmetro representa se a compra está sendo feita ou não com o cartão da loja. Se a pessoa que estiver fazendo a compra possuir o cartão da loja e possui convênio então o desconto será de 15%. Se o usuário possuir convenio ou estiver fazendo a compra pelo cartão da loja o desconto é de 10%. Caso o usuário não tenha nenhum desses benefícios não existe desconto para a compra.

A declaração da função, propriedades e lógica de negócio estão implementadas corretamente.

Nota: 10 Parabéns 🥳

Comentários

A primeira coisa que notei no seu código foi a duplicação de lógica entre as suas funções validadorDesconto, validadorDesconto e compraDezPorCento. Na qualidade de software temos o conceito da responsabilidade única. Essa conceito prega que devemos dar responsabilidade únicas para lógicas que devemos implementar. Da forma que está implementada, você teria que ir em dois locais para modificar a lógica de aplicação do deconto. Por isso recomendo que você utilize outra abordagem: faça a lógica do desconto em funções puras e reaproveite elas conforma sua necessidade. Veja abaixo como seria a implementação para o desconto de 10%.

const descontoDez = (valorCompra) => valorCompra - valorCompra * 0.1;

https://github.com/Rlangbecker/Ti21-DWII-Pr.Mathias/blob/99085c95261aadeef11fb20d485c57db0c3f6cf7/Exercicios/0.1.2/index.js#L8-L11

Na sua primeira condicional você faz uma verificação que dificulta a leitura da sua lógica, essa verificação é importante porque a sua condicional para o desconto de 15% é feita na linha 14. Porém, se você inverter a ordem você não irá precisar verificar isConvenio && isCartao === false. Veja abaixo como seria.

function validadorDesconto(valorCompra, isConvenio, isCartao) {
  if (isCartao && isConvenio) {
    return compraDezPorCento(isConvenio, isCartao, valorCompra);
  } else if (isCartao || isConvenio) {
    return compraQuinzePorCento(
      isConvenio,
      isCartao,
      valorCompra
    );
  } else {
    return valorCompra;
  }
}

Por fim, como iremos ver em aulas futuras, você poderia declarar a suas funções compraQuinzePorCento e compraDezPorCento dentro de validadorDesconto. Isso é possível por conta da funcionalidade chamada de closure ^1 e pode ser usado para impossibilitar que essas funções fossem usadas fora do contexto de validadorDesconto. Veja abaixo como seria a sintaxe. Iremos fazer uso de closures quando chegarmos no conteúdo de components no React.

function validadorDesconto(valorCompra, isConvenio, isCartao) {
  const compraQuinzePorCento = () => {}; //logica
  const compraDezPorCento = () => {}; //logica

  // logica
}
Rlangbecker commented 2 years ago

Não me atentei quanto a condicional, geralmente faço a primeira etapa sendo as duas variáveis em questão === True... E interessante essa funcionalidade "closure", assim não precisa buscar outra posição para saber o que tem que fazer, só declarar dentro da propria função. Obrigado pelo feedback professor!