da2k / curso-javascript-ninja

Curso Javascript Ninja
http://blog.da2k.com.br/curso-javascript-ninja/
2.35k stars 2.94k forks source link

[Challenge 03] Dúvida sobre performance e legibilidade do código! #7346

Closed nalucode closed 5 years ago

nalucode commented 5 years ago

Este é meu código para resolver o desafio 03:

// Declarar uma variável qualquer, que receba um objeto vazio.
var x= {};

/*
Declarar uma variável `pessoa`, que receba suas informações pessoais.
As propriedades e tipos de valores para cada propriedade desse objeto devem ser:
- `nome` - String
- `sobrenome` - String
- `sexo` - String
- `idade` - Number
- `altura` - Number
- `peso` - Number
- `andando` - Boolean - recebe "falso" por padrão
- `caminhouQuantosMetros` - Number - recebe "zero" por padrão
*/
var pessoa = {
    nome : 'Luan',
    sobrenome : 'Melo',
    sexo : 'Masculino',
    idade : 19,
    altura : 1.83,
    peso : 82.5,
    andando : false,
    caminhouQuantosMetros : 0
}

/*
Adicione um método ao objeto `pessoa` chamado `fazerAniversario`. O método deve
alterar o valor da propriedade `idade` dessa pessoa, somando `1` a cada vez que
for chamado.
*/
pessoa.fazerAniversario = function(){
    pessoa.idade++
}

/*
Adicione um método ao objeto `pessoa` chamado `andar`, que terá as seguintes
características:
- Esse método deve receber por parâmetro um valor que representará a quantidade
de metros caminhados;
- Ele deve alterar o valor da propriedade `caminhouQuantosMetros`, somando ao
valor dessa propriedade a quantidade passada por parâmetro;
- Ele deverá modificar o valor da propriedade `andando` para o valor
booleano que representa "verdadeiro";
*/
pessoa.andar = function(m){
    pessoa.andando = true;
    pessoa.caminhouQuantosMetros += m;
}

/*
Adicione um método ao objeto `pessoa` chamado `parar`, que irá modificar o valor
da propriedade `andando` para o valor booleano que representa "falso".
*/
pessoa.parar = function(){
    pessoa.andando = false;
}

/*
Crie um método chamado `nomeCompleto`, que retorne a frase:
- "Olá! Meu nome é [NOME] [SOBRENOME]!"
*/
pessoa.nomeCompleto = function(){
    return `Olá! Meu nome é ${pessoa.nome} ${pessoa.sobrenome}!`
}

/*
Crie um método chamado `mostrarIdade`, que retorne a frase:
- "Olá, eu tenho [IDADE] anos!"
*/
pessoa.mostrarIdade = function(){
    return `Olá, eu tenho ${pessoa.idade} anos!`
}

/*
Crie um método chamado `mostrarPeso`, que retorne a frase:
- "Eu peso [PESO]Kg."
*/
pessoa.mostrarPeso = function(){
    return `Eu peso ${pessoa.peso}Kg.`
}

/*
Crie um método chamado `mostrarAltura` que retorne a frase:
- "Minha altura é [ALTURA]m."
*/
pessoa.mostrarAltura = function(){
    return `Minha altura é ${pessoa.altura}m.`
}

/*
Agora vamos brincar um pouco com o objeto criado:
Qual o nome completo da pessoa? (Use a instrução para responder e comentários
inline ao lado da instrução para mostrar qual foi a resposta retornada)
*/
pessoa.nomeCompleto(); // "Ola! Meu nome é Luan Melo!"

/*
Qual a idade da pessoa? (Use a instrução para responder e comentários
inline ao lado da instrução para mostrar qual foi a resposta retornada)
*/
pessoa.mostrarIdade(); // "Olá, eu tenho 19 anos!"

/*
Qual o peso da pessoa? (Use a instrução para responder e comentários
inline ao lado da instrução para mostrar qual foi a resposta retornada)
*/
pessoa.mostrarPeso(); // "Eu peso 82,5Kg."

/*
Qual a altura da pessoa? (Use a instrução para responder e comentários
inline ao lado da instrução para mostrar qual foi a resposta retornada)
*/
pessoa.mostrarAltura(); // "Minha altura é 1.83m."

/*
Faça a `pessoa` fazer 3 aniversários.
*/
pessoa.fazerAniversario();
pessoa.fazerAniversario();
pessoa.fazerAniversario();

/*
Quantos anos a `pessoa` tem agora? (Use a instrução para responder e
comentários inline ao lado da instrução para mostrar qual foi a resposta
retornada)
*/
pessoa.mostrarIdade() // "Olá, eu tenho 22 anos!"

/*
Agora, faça a `pessoa` caminhar alguns metros, invocando o método `andar` 3x,
com metragens diferentes passadas por parâmetro.
*/
pessoa.andar(8);
pessoa.andar(10);
pessoa.andar(2);

/*
A pessoa ainda está andando? (Use a instrução para responder e comentários
inline ao lado da instrução para mostrar qual foi a resposta retornada)
*/
pessoa.andando; // true

/*
Se a pessoa ainda está andando, faça-a parar.
*/
pessoa.parar();

/*
E agora: a pessoa ainda está andando? (Use uma instrução para responder e
comentários inline ao lado da instrução para mostrar a resposta retornada)
*/
pessoa.andando; // false

/*
Quantos metros a pessoa andou? (Use uma instrução para responder e comentários
inline ao lado da instrução para mostrar a resposta retornada)
*/
pessoa.caminhouQuantosMetros //20

/*
Agora vamos deixar a brincadeira um pouco mais divertida! :D
Crie um método para o objeto `pessoa` chamado `apresentacao`. Esse método deve
retornar a string:
- "Olá, eu sou o [NOME COMPLETO], tenho [IDADE] anos, [ALTURA], meu peso é [PESO] e, só hoje, eu já caminhei [CAMINHOU QUANTOS METROS] metros!"

Só que, antes de retornar a string, você vai fazer algumas validações:
- Se o `sexo` de `pessoa` for "Feminino", a frase acima, no início da
apresentação, onde diz "eu sou o", deve mostrar "a" no lugar do "o";
- Se a idade for `1`, a frase acima, na parte que fala da idade, vai mostrar a
palavra "ano" ao invés de "anos", pois é singular;
- Se a quantidade de metros caminhados for igual a `1`, então a palavra que
deve conter no retorno da frase acima é "metro" no lugar de "metros".
- Para cada validação, você irá declarar uma variável localmente (dentro do
método), que será concatenada com a frase de retorno, mostrando a resposta
correta, de acordo com os dados inseridos no objeto.
*/
pessoa.apresentacao = function(){
    x = []
    if (pessoa.sexo == "Masculino") {
        x.push('o');
    } else {
        x.push('a');
    }
    if (pessoa.idade <=1){
        x.push('ano');
    }else{
        x.push('anos');
    }
    if (pessoa.caminhouQuantosMetros <= 1){
        x.push('metro');
    } else {
        x.push('metros');
    }
    return `Olá, eu sou ${x[0]+' '+pessoa.nome+' '+pessoa.sobrenome}, tenho ${pessoa.idade+' '+x[1]}, ${pessoa.altura}m, meu peso é ${pessoa.peso} kg e, só hoje, eu já caminhei ${pessoa.caminhouQuantosMetros+' '+x[2]}`
}

// Agora, apresente-se ;)
pessoa.apresentacao()

A minha dúvida é no trecho

 x = []
    if (pessoa.sexo == "Masculino") {
        x.push('o');
    } else {
        x.push('a');
    }
    if (pessoa.idade <=1){
        x.push('ano');
    }else{
        x.push('anos');
    }
    if (pessoa.caminhouQuantosMetros <= 1){
        x.push('metro');
    } else {
        x.push('metros');
    }

é a melhor forma, ou eu deveria realmente definir uma variável para cada validação?

Outra questão é, se neste trecho em que retorno a apresentação. Esta seria melhor forma de retornar este valor? Achei pouco legível, sei que teremos dicas voltadas a isto no curso, mas gostaria de ir aplicando boas práticas aos meus códigos dos desafios.

@fdaciuk

fdaciuk commented 5 years ago

Oi @nalucode! Só pra você ficar tranquilo: nesses primeiros desafios, a ideia é que você conheça a linguagem, sem precisar se preocupar com boas práticas ou performance, de maneira geral.

O importante é tentar resolver os desafios, usando apenas o conhecimento adquirido no curso até então, para você saber se realmente conseguiu absorver o que foi apresentado :)

Mais pra frente nós iremos sim aprensentar boas práticas e melhores maneiras de resolver um problema, então fique super tranquilo nesse início. Apenas tente entender o que a linguagem te a lhe oferecer, e como você pode resolver problemas com o que está sendo ensinado :)

Mas vamos lá. Sobre a sua dúvida: a primeira coisa a se levar em consideração é: toda variável DEVE ser declarada. Você usou x = [], mas o ideal é sempre declarar usando a palavra chave var, dessa forma:

var x = [];

Estou ignorando const e let nesse momento por conta do contexto do curso, então se você já conhece essas outras formas de declarar, pode ficar sossegado.

Sobre ir fazendo push nesse array para depois exibir a frase com os números dos índices, não acho que seja a melhor solução, pois, se você apenas ler a mensagem retornada, vai ter que analisar todo o código pra entender quem é o índice 0, quem é o índice 1, e assim por diante.

Talvez uma solução melhor, se você não quiser declarar variáveis para cada opção, poderia ser usando um objeto, onde as propriedades são nomeadas. Dessa forma seu código ficaria, com certeza, muito mais legível :)

Espero que tenha ficado claro! Qualquer coisa, fique à vontade para perguntar :)