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

muitos ifs encadeados

como faria para diminuir a quantidade de ifs em casos como esse? onde eu tenho que setar a experiencia de um jogador baseando-se na sua idade

private void setExperience() {
        if (this.getAge() >= 18 && this.getAge() <20) {
            this.experience = (1);
        } else if (this.getAge() >= 20 && this.getAge()<23) {
            this.experience = (2);
        } else if (this.getAge() >= 23 && this.getAge() <25) {
            this.experience = (3);    
        } else if (this.getAge() >= 25 && this.getAge() <27) {
            this.experience = (4);    
        } else if (this.getAge() >= 27 && this.getAge() <29) {
            this.experience = (5);    
        } else if (this.getAge() >= 29 && this.getAge() <32) {
            this.experience = (6);    
        } else if (this.getAge() >= 32 && this.getAge() <34) {
            this.experience = (7);    
        } else if (this.getAge() >= 34 && this.getAge() <36) {
            this.experience = (8);    
        } else if (this.getAge() >= 36 && this.getAge()<38) {
            this.experience = (9);    
        } else if (this.getAge() >= 38 && this.getAge() <42) {
            this.experience = (10);    
        }
    }
7 respostas

Bom dia Vanessa, tudo bom? Uma ótima altenartiva que eu encontro para esse tipo de problema é a utilização do switch case. Você pode dar uma olhada na sintaxe dele nesse link aqui: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/switch

solução!

Bom dia!

Olha, minha primeira sugestão seria padronizar a progressão pra transformar isso aí numa fórmula. Você tem essa opção? Por que em média você está dando 1 ponto de experiencia para cada 2 anos vividos após 18 anos... Mas a distribuição não está uniforme. Mas repare que se pegar a última faixa (38 anos), poderia fazer simplesmente "(38 - 18)/2" e daria exatamente os 10 pontos que você quer alcançar nessa faixa. Você pode usar "Math.ceil" para arredondar o resultado pra cima. Eu sinceramente faria assim:

this. experience = Math.ceil ( ( this.getAge ( ) - 17 ) / 2 );

A distribuição não vai ficar exata em relação ao que você colocou, mas vai ficar muito próxima e a legibilidade do código muito melhor... É muito mais fácil em programação lidar com valores que seguem uma lógica ou padrão do que valores que são discretamente definidos dessa forma.

A alternativa que geralmente temos à "if...else" é "switch", mas switch atalha um pouco a vida quando cada valor tem uma saída específica, como no seu caso você tem múltiplos valores com a mesma saída ainda vai ficar um pouco extenso... Acho que transformar essa conta aí numa fórmula ainda deixaria o código mais legível.

achei muito genial e interessante, e se fosse em um caso como esse? como ficaria essa formula

public void setVelocidade() {
        /* utilizei o peso maximo e o imc limite para calcular a altura máxima de cada categoria
           e dividi o delta peso e a altura máxima em 8 para atribuir os valores abaixo
           ordem: peso leve || peso medio || peso pesado */
        if (peso>=60.2 && peso<61.5            ||    peso>70.3 && peso<72        ||    peso>83.9 && peso<88.3) {
            this.velocidade = 2;
        } else if (peso>=61.5 && peso<62.6    ||    peso>=72 && peso<73.7        ||    peso>=88.3 && peso<93) {
            this.velocidade = (3);
        } else if (peso>=62.6 && peso<64    ||    peso>=73.7 && peso<75.4        ||    peso>=93 && peso<97.5) {
            this.velocidade = (4);
        } else if (peso>=64 && peso<65.3    ||    peso>=75.4 && peso<77        ||    peso>=97.5 && peso<102) {
            this.velocidade = (5);
        } else if (peso>=65.3 && peso<66.5    ||    peso>=77 && peso<78.6        ||    peso>=102 && peso<106.4) {
            this.velocidade = (6);
        } else if (peso>=66.5 && peso<67.8    ||    peso>=78.6 && peso<80.3        ||    peso>=106.4 && peso<111) {
            this.velocidade = (7);
        } else if (peso>=67.8 && peso<69    ||    peso>=80.3 && peso<82.1        ||    peso>=111 && peso<115.6) {
            this.velocidade = (8);
        } else if (peso>=69 && peso<=70.3    ||    peso>=82.1 && peso<=83.9    ||    peso>=115.6 && peso<=120.2) {
            this.velocidade = (9);
        }

Nossa... kkk, ok deixa eu ver se entendi. Então são três categorias: Leve, médio e pesado. Talvez eu começasse separando essas três categorias via if, que aí ficava mais uniforme já... Aí o peso na categoria leve, por exemplo, vai de 60 para 61.5 // 61.6 para 62.5 // 62.6 para 63.9 // 64 para 65.2... Até a categoria final a partir de 69 (com velocidade 9).

Pensa assim... de 60 a 70 você está variando em 8 a velocidade... Acho que faria assim:

//Categoria 1 - Peso Leve
if (peso > 60.1 && peso < 70.4) { 
    this.velocidade = 1 + Math.ceil((peso - 59)  * 0.8); 
} 

//categoria 2 - Peso Médio
else if (peso >= 70.4 && peso < 84){
        this.velocidade = ... 
}
etc

A conta peso - 59 no exemplo do peso leve, vai te devolver aproximadamente um número entre 1 e 8, certo? Aí se multiplicar isso por 0.8, vai ter as velocidades aproximadas que você quer (1 e 8 vai virar de 0.8 até quase 8). Aí você arredonda pra cima pra pegar números inteiros, e vai receber um retorno entre 1 e 8. Como você quer que a velocidade inicial seja 2, estou somando 1 no começo da fórmula, aí você passa a ter um número entre 2 e 9. Acho que se conseguir entender esse exemplo, você deve conseguir completar as categorias Médio e Pesado no código, vai virar um if com 3 cláusulas. Por isso que essas operações básicas são tão importantes em programação, quebram um galho grande se conseguir quebrar a cabeça pra simplificar uma regra em fórmula desse jeito.

Qualquer dúvida, só dar o grito!

só não entendi muito bem como funciona esse math.ceil

No site da Devmedia tem um tópico a respeito math.ceil, achei bem interessante. Espero que ajude também!!

https://www.devmedia.com.br/arredondando-numeros-em-java/28248#:~:text=ceil(),um%20decimal%20da%20mesma%20forma.

Acho que vai ficar mais claro quando você estudar métodos/funções, Vanessa... Esse ceil vem de ceiling (teto)... É uma função que pega tudo dentro do parênteses, e calcula qual o número inteiro mais próximo, arredondando pra cima, e devolve esse número. Rode uns testes, talvez fique mais intuitivo, mas a início, a título de exemplo, Math.ceil(3.756) vai te devolver "4" por exemplo. Mas se você ainda tá começando a entender if's e whiles e tal, talvez seja melhor deixar pra estudar isso em detalhes mais pra frente... Mas conseguiu utilizar com sucesso?