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

Gostaria de dicas para otimizar meu código

Fala pessoal, terminei esse curso e decidi exercitar mais.

Os códigos que irei postar aqui estão todos funcionais, mas eu gostaria de uma forma de otimizá-los, sem ter que escrever tantas linhas.

Esse código abaixo valida os campos do array conforme a escrita do usuário.


    //valida sexo

    var contador = 1;

    while (contador < 2) {

        var sexo = prompt('Digite seu sexo F para Feminino ou M para Masculino)');

        var feminino = ['f', 'F', 'feminino', 'Feminino', 'FEMININO'];
        var masculino = ['m', 'M','masculino', 'Masculino', 'MASCULINO'];



        var achou = false;

        for(var i = 0; i < feminino.length; i = i + 1) {

            if(feminino[i] == sexo) {
                var mulher = true;
                achou = true;
                break;
            }
        }

        for(var i = 0; i < masculino.length; i = i + 1) {

            if(masculino[i] == sexo) {
                var homem = true;
                achou = true;
                break;
            }
        }


        if (achou == true) {

            if (mulher == true) {

                console.log('Sexo: Feminino');
                contador++;

            } 

            if (homem == true) {

                console.log('Sexo: Masculino');
                contador++;

            }     

        }

        else {                     
            alert('Digite seu sexo novamente');
        }

    }

A questão é que eu apliquei uma lógica semelhante nesse outro trecho, mas eu não queria repetir o que fiz no código acima, aonde criei um array independente para "masculino" e "feminino".

Gostaria de adicionar todas as opções no array "estadosCivis" e já identificaria qual a entrada do usuário e salvaria isso, sem ter que ficar comparando um por um ou ter que criar vários arrays diferentes para cada estado civil.

Claro, o código precisa continuar validando, o código abaixo é funcional mas ainda não está da forma que imaginei, poderiam me ajudar?

//valida Estado Civil

    var contador = 1;

    while (contador < 2) {

        var estado = prompt('Digite seu sexo Estado Civil c-casado, s-solteiro, v-viuvo, d-divorciado');

        var estadosCivis = ['c','s','v','d'];    


        var achou = false;

        for(var i = 0; i < estadosCivis.length; i = i + 1) {

            if(estadosCivis[i] == estado) {
                achou = true;
                break;
            }
        }



        if (achou == true) {

            if (estado == 'c') {

                console.log('Estado Civil: Casado(a)');
                contador++;

            } 


            if (estado == 's') {

                console.log('Estado Civil: Solteiro(a)');
                contador++;

            } 

            if (estado == 'v') {

                console.log('Estado Civil: Viuvo(a)');
                contador++;

            } 

            if (estado == 'd') {

                console.log('Estado Civil: Divorciado(a)');
                contador++;

            } 



        }

        else {                     
            alert('Digite seu Estado Civil novamente');
        }

    }
4 respostas

Oi Ricardo,

Que tal uma função que recebe um array de opções e uma opção, procura e devolve a opção escolhida? Você pode devolver alguma específica no caso de não encontrar.

Você de fato reaproveita o código da procura e só trata as opções diferentes para cada caso. Por exemplo:

function procura(opcoes, opcao) {
    for(var i = 0; i < opcoes.length; i = i + 1) {
        if(opcoes[i] == opcao) {
            return opcao;
        }
    } 
    return "NAO_ENCONTRADO";
}

Depois bastaria chamar essa função passando os estados civis ou gêneros, verificar se é diferente de NAO_ENCONTRADO e tratar de acordo.

Se você continuar estudando aqui na Alura, logo encontrará estruturas de dados poderosas que facilitarão esse tipo de procura.

Opa, entendi a parte do reaproveitamento do código, realmente ajuda, não tinha bolado uma forma de criar uma função que fosse genérica.

Mas mesmo com essa função eu continuo com esse problema:

Por exemplo, se o usuário digitar "s" que no código significa solteiro, ele vai retornar a string "S", como meu código vai imprimir isso na tela da forma correta? Dizendo que é solteiro? Até posso indicar que "s" significa solteiro pra ele e resolvo o problema, só que tenho mais de 10 itens em um array, como vou automatizar isso?

Quero fazer que nem o trecho que fiz do sexo, quando o usuário digitar Masculino ou MASCULINO, o meu programa vai entender de qualquer forma.

Como eu disse, da pra aplicar a mesma lógica desse primeiro trecho que citei, mas quero automatizar buscando tudo no mesmo array, que ele entenda que "s", "solteiro", "Solteiro" ou "SOLTEIRO" são a mesma coisa. Sendo que no mesmo array terei também "d", "divorciado", "Divorciado" , "DIVORCIADO" e etc...

Ficou muito confuso? Hahahah

Valeu pela atenção e pela ajuda!

solução!

É trabalhoso mesmo. Trabalhar em cima de valores inseridos pelo usuário é um dos maiores problemas que temos no dia-a-dia. Por enquanto, sua única saída são diversos if. Você pode trabalhar para tentar reduzir a quantidade.

Por exemplo, você pode bolar uma função que dada uma string, a converte para letras minúsculas. Dessa forma basta você verificar algo como masculino mesmo que o usuário tenha escrito MaScULiNo. Veja que isso ainda não resolve totalmente o problema, pois poderíamos ter acentos, pontuação, espaços, etc.

Uma solução bem simples é atribuir um número para cada opção. Se o usuário digita 1 é solteiro, 2 é casado, etc. No código você apenas verifica qual número foi digitado e trabalha em cima disso.

É claro que essa solução não é tão interessante para o usuário, porque é muito mais natural escrever solteiro do que o número 1. Mesmo no programa, é muito fácil confundir qual número representa o quê. Por isso, muitas linguagens tem um mecanismo que automatiza essa associação entre valores e números. Esse conceito é conhecido como enumeração.

Em geral, quando temos um número fixo de opções, não deixamos o usuário digitar para contornar esses problemas. Você já deve ter visto formulários por aí onde você seleciona o estado civil numa lista, sem ter a possibilidade de escrever.

Mesmo assim, vejamos outros exemplos de problemas muito comuns. Se você tem um campo CEP, alguns usuário digitam 12345-000, já outros 12345000. No caso do telefone, poderiamos ter 11 987654321, 011987654321, (11) 98765-4321, etc. CPF/CNPJ com ou sem pontuação? Tudo isso tem que ser tratado.

Valeu Gabriel! Vou estudar as opções que tenho e resolver com o IF por enquanto :)