Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

É possível fazer esse exercício com Switch?

Olá! Durante o módulo dei umas olhadas no fórum e vi um exercício feito com Switch. O que me chamou a atenção foi a melhora da legibilidade do código. Sei que não é algo que deva ser usado em todos os casos, porém para melhor entendimento gostaria de saber se é possível usar o switch neste código, e se sim, como ficaria. Obrigado!

<meta charset="UTF-8">

<canvas width="600" height="400"></canvas>

<script>

    function desenhaQuadrado(x, y, tamanho, cor) {

        pincel.fillStyle = cor;
        pincel.fillRect(x, y, tamanho, tamanho)
        pincel.fill();
    }

    function desenhaCirculo(x, y, raio, cor) {

        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, raio, 0, 2 * 3.14);
        pincel.fill();

    }

    function desenhaPaletaDeCores() {

        desenhaQuadrado(xVermelho, yQuadrados, tamanhoQuadrados, 'red');
        desenhaQuadrado(xVerde, yQuadrados, tamanhoQuadrados, 'green');
        desenhaQuadrado(xAzul, yQuadrados, tamanhoQuadrados, 'blue');
        desenhaQuadrado(xLimpa, yQuadrados, tamanhoQuadrados, 'white');

    }

    function lidaComMovimentoDoMouse(evento) {

        x = evento.pageX - tela.offsetLeft;
        y = evento.pageY - tela.offsetTop;

        if((desenha) && (y > tamanhoQuadrados + 10)) {

            desenhaCirculo(x, y, 5, corAtual);
        }
    }

    function habilitaDesenhar() {

        desenha = true;


    }

    function escolheCor(){

        if((x <= tamanhoQuadrados) && (y <= tamanhoQuadrados)){
            corAtual = 'red';
        }else if((x < xAzul) && (x > xVerde) && (y < tamanhoQuadrados)){
            corAtual = 'green';
        }else if((x >= xAzul) && (x < xAzul + tamanhoQuadrados) && (y < tamanhoQuadrados)){
            corAtual = 'blue';
        }else if((x > xLimpa) && (y < tamanhoQuadrados)){
            limpaTela();
        }

    }

    function desabilitaDesenhar() {

        desenha = false;
    }

    function limpaTela(){

        pincel.clearRect(0, 51, 600, 349);
        pincel.fillStyle = 'lightgrey'
        pincel.fillRect(0,51, 600, 349);

    }

    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');
    pincel.fillStyle = 'lightgray';
    pincel.fillRect(0, 0, 600, 400);

    var x;
    var y;
    var desenha = false;
    var corAtual = 'blue';
    var xVermelho = 0;
    var xVerde  = 50;
    var xAzul = 100;
    var yQuadrados = 0;
    var xLimpa = 540;
    var tamanhoQuadrados = 50;

    desenhaPaletaDeCores(); // mostra os quadrados de seleção de cores

    tela.onmousemove = lidaComMovimentoDoMouse;

    tela.onmousedown = habilitaDesenhar;

    tela.onmouseup = desabilitaDesenhar;

    tela.onclick = escolheCor;

</script>
2 respostas
solução!

Boa tarde buenojc,

O switch é interessante quando temos um if muito longo para diversos resultados da mesma expressão, por exemplo:

var operacaoBancaria = 0;

// usando else if
if (operacaoBancaria === 1) {
    alert('saque');
} else if (operacaoBancaria === 2) {
    alert('transferência');
} else if (operacaoBancaria === 3) {
    alert('depósito');
} else if (operacaoBancaria === 4) {
    alert('empréstimo');
} else {
    alert('erro, operação não encontrada');
}

//usando switch
switch(operacaoBancaria) {
    case 1:
      alert('saque');
    break;
  case 2:
      alert('transferência');
    break;
  case 3:
      alert('depósito');
    break;
  case 4:
      alert('empréstimo');
    break;
  default:
      alert('erro, operação não encontrada');
    break;  
}

No seu código o único lugar que poderia ser substituído por um Switch seria aqui:

        if((x <= tamanhoQuadrados) && (y <= tamanhoQuadrados)){
            corAtual = 'red';
        }else if((x < xAzul) && (x > xVerde) && (y < tamanhoQuadrados)){
            corAtual = 'green';
        }else if((x >= xAzul) && (x < xAzul + tamanhoQuadrados) && (y < tamanhoQuadrados)){
            corAtual = 'blue';
        }else if((x > xLimpa) && (y < tamanhoQuadrados)){
            limpaTela();
        }

O problema é que neste caso estão sendo avaliadas múltiplas expressões e ainda por cima expressões booleanas, portanto nesse caso não vale a pena usar um switch, você acabaria escrevendo mais código e ele ficaria mais difícil de entender.

Abraços

Ah sim! Muito obrigado!