3
respostas

Gostaria se há como "enxugar" este código???

Pessoal...!

Não trabalho com programação e fiz o meu melhor...! Mas , na esperança de sempre aprender mais, gostaria de saber a opinião de vocês sobre como enxugar este código??

Obrigado.

<meta charset="utf-8">

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

<script>
    //Representa os percentuais de cada ano.
     var serie2015 = [50, 25, 20, 5];
     var serie2016 = [65, 20, 13, 2];
     var navegador = ['Chrome','Firefox','Safari', 'outros'];
     var cores     = ['blue', 'green', 'yellow', 'red'];

    var py=0;
    var largura = 0;
    var altura= 50;
    var  cor = '';
    desenhaTexto(0 ,20 ,'Procuramos em alguns relatórios da Alura quais navegadores os nossos alunos utilizavam em 2015 e 2016. Separamos os dados:');

    function desenhaRetangulo(x, y,altura, largura, cor) {
        var tela = document.querySelector('canvas');
        var pincel = tela.getContext('2d');

        pincel.fillStyle=cor;
        pincel.fillRect(x,y, largura, altura);
        pincel.strokeStyle='black';
        pincel.strokeRect(x,y, largura, altura);
    }

    function desenhaTexto(x, y, texto) {
        var tela = document.querySelector('canvas');
        var pincel = tela.getContext('2d');

        pincel.font='15px Georgia';
        pincel.fillStyle='black';
        pincel.fillText(texto, x, y);    
    }

  function desenhaBarra(x,y, serie, cores, texto, porcentagem){ 

          for( var i = 0; i < serie.length; i++){
               altura = serie[i];
               cor = cores[i];                  
                 desenhaRetangulo(x,y+py,altura, 50, cor );
               py+=altura 
            }  
                 desenhaTexto(x+5,y-5,texto);        
               py=0; 
    }         

   function desenhaLegenda(x,y,navegador,cores, serie,texto){
            for( var i = 0; i < serie.length; i++){
                 var n = navegador[i];
                 cor = cores[i];
                  desenhaRetangulo(x, y, 20, 20, cor);
                  desenhaTexto(x-15,y+35,n);
                 x += 85;
            } 
            if(serie == serie2015){
                for(var i =0; i < serie.length; i++){
                   altura = serie[i];
                 if(i>=2){
                   desenhaTexto(x-240, y-altura-30 , altura +'%');
                 }else{
                   desenhaTexto(x-240, y-altura-52 , altura+'%');
                 }                    
                }
            }else{
                for(var i =0; i < serie.length; i++){
                    altura = serie[i];
                     if(i==0){
                        desenhaTexto(x-90, y-altura-45 , altura +'%');
                        }
                       if(i==1){
                             desenhaTexto(x-90, y-altura-41 , altura +'%');
                            }
                           if(i==2){
                             desenhaTexto(x-90, y-altura-32 , altura +'%');
                            }if (i == 3){
                            desenhaTexto(x-90, y-altura-24 , altura +'%');
                            } 
                            //desenhaTexto(x-100, y-altura-28 , altura +'%');     
                        }
                } 
    }

    desenhaBarra(100, 50, serie2015, cores, '2015');
    desenhaBarra(250, 50, serie2016, cores, '2016');
    desenhaLegenda(60, 190, navegador, cores, serie2015);
    desenhaLegenda(60, 190, navegador, cores, serie2016);

</script>
3 respostas

Olá, Anderson! Tudo bem contigo?

Nós agradecemos por ter compartilhado o código conosco! Ficou excelente!

Tenho certeza que vai contribuir com os demais alunos!

Se mexermos no código vai estragar rs...

Muitas vezes enxugar códigos não é sinônimo de código bem escrito! O importante é quando batemos o olho e entendemos cada bloco de código e suas funcionalidades igualmente como está o seu!

Parabéns, Anderson!

Você está no caminho certo!

Um abraço e bons estudos!

Olá Anderson, tudo bem com você?

Ficou ótimo a sua solução. implementando a legenda :)

Gostaria de saber a opinião de vocês sobre como enxugar este código??

Então, da maneira como você fez acredito que conseguiu enxugar bastante do código, a principal forma de conseguirmos deixar um código mais enxuto é ter coisas parecidas para que a gente possa transformar em uma função, ou alguma lógica que da para diminuir

Entretanto, esses códigos no canvas tem um detalhe que é a posição na tela, então normalmente ficam bem grandes porque qualquer tentativa de deixar mais curto acaba tornando o resultado bem diferente do esperado, porque cada elemento tem um pixel especifico

A única coisa que você poderia estar alterando, mas seria apenas uma questão mais de gosto, seria trocar o if por um switch, por exemplo:

                     if(i==0){
                        desenhaTexto(x-90, y-altura-45 , altura +'%');
                        }
                       if(i==1){
                             desenhaTexto(x-90, y-altura-41 , altura +'%');
                            }
                           if(i==2){
                             desenhaTexto(x-90, y-altura-32 , altura +'%');
                            }if (i == 3){
                            desenhaTexto(x-90, y-altura-24 , altura +'%');
                            } 
                            //desenhaTexto(x-100, y-altura-28 , altura +'%');     
                        }

Dentro das linguagens de programação, temos a estrutura chamada de switch case que tem a seguinte estrutura:

switch (valor){
    case possibilidade:
} 

Ou seja, passamos, um valor, e podemos definir várias possibilidades, caso ele atenda uma ele executa ela e todas abaixo, então poderíamos trocar o mesmo código por:

switch(i){
      case 0:
           desenhaTexto(x - 90, y - altura - 45, altura + '%');
             break;
       case 1:
            desenhaTexto(x - 90, y - altura - 41, altura + '%');
             break;
       case 2:
             desenhaTexto(x - 90, y - altura - 32, altura + '%');
              break;
      case 3:
             desenhaTexto(x - 90, y - altura - 24, altura + '%');
             break;
}

Ou seja, dado o indice i eu vejo qual valor ele vale (1, 2, ou 3), veja que depois de fazer o que eu quero, eu adiciono o break;, isso quer dizer que é apenas para executar aquela instrução e sair do switch, caso contrário, ele executaria todas as instruções de uma vez só :)

Mas a sua solução está ótima!!

Abraços e Bons Estudos!

Caros colegas, obrigado pelo feedBack...!

As opiniões de vocês servem para que nós, alunos mais inexperientes, possamos nos nortear.

Cassio, obrigado pelas palavras incentivadoras...! Isso nos dá mais segurança em saber que estamos indo ao rumo certo.

Geovani, implementei a sua sugestão no meu código. Achei que o cód. ficou mais "elegante"! RS Obrigado...!