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

[Projeto] Exercício: Avaliando a pontuação de um usuário

Nessa solução, o usuário informa sua própria pontuação final.
Também usei um objeto para mapear os resultados em vez de vários if/else ou um ternário longo, conforme foi recomendado em casos similares.

import { createInterface } from "readline";

const rl = createInterface({
  input: process.stdin,
  output: process.stdout,
});

const validarInput = (input) => {
  input = Number(input);

  if (Number.isNaN(input) || !Number.isInteger(input)) return null;
  return input;
};

const avaliarDesempenho = (pontos, callback) => {
  const resultado =
    pontos < 50 ? "reprovado" : pontos < 70 ? "reforço" : "aprovado";

  console.log(`Pontuação: ${pontos}`);

  callback(resultado);
};

const gerarMensagem = (resultado) => {
  const msgsDisponiveis = {
    reprovado: "Infelizmente, você foi reprovado.",
    reforço: "Cuidado! Você precisa de reforço",
    aprovado: "Parabéns! Você foi aprovado!",
  };

  console.log(msgsDisponiveis[resultado]);
  rl.close();
};

rl.question("Quantos pontos você juntou?\n> ", (input) => {
  const pontos = validarInput(input);

  if (pontos === null) {
    console.log("Insira uma pontuação válida.");
    rl.close();
    return;
  }

  avaliarDesempenho(pontos, gerarMensagem);
});
2 respostas
solução!

Olá, Vitor Hugo. Como vai?

Parabéns pelo excelente projeto! É muito bacana ver você saindo do básico e aplicando padrões de desenvolvimento que tornam o código muito mais profissional. Sua escolha de utilizar objetos para mapeamento e callbacks demonstra que você já está dominando conceitos avançados de JavaScript.

Analisando sua solução, gostaria de destacar os pontos que tornaram seu código diferenciado:

  • Mapeamento com Objeto (msgsDisponiveis): Essa é uma prática excelente. Ao usar um objeto em vez de múltiplos if/else, você melhora a legibilidade e facilita a manutenção do código. Se amanhã você precisar adicionar um novo status (como "excelente"), basta adicionar uma linha ao objeto.
  • Uso de Callbacks: A estrutura avaliarDesempenho(pontos, callback) mostra que você entende o conceito de funções de alta ordem. Isso torna seu código mais modular, pois a lógica de avaliação está separada da lógica de exibição da mensagem.
  • Validação Robusta: Você não apenas converteu o input para número, mas usou Number.isInteger e Number.isNaN. Isso previne que o programa tente processar textos ou números decimais caso a regra de negócio exija apenas inteiros.
  • **Uso do Módulo readline**: Implementar a interação via terminal utilizando createInterface é uma ótima forma de praticar o funcionamento do ambiente Node.js fora do navegador.

Dica técnica:
Uma pequena sugestão para deixar sua função avaliarDesempenho ainda mais alinhada com o que você comentou sobre evitar ternários longos: embora o ternário que você usou seja simples e legível, em casos de muitas faixas de pontuação, você poderia usar uma estrutura de busca em array ou um objeto de faixas. Mas, para três condições, sua abordagem atual está muito limpa.

Para evoluir ainda mais, você poderia tentar transformar essa lógica usando Promises ou async/await, que são o padrão moderno para lidar com operações de entrada e saída (I/O) como o readline.

Seu progresso está nítido pela organização e escolha das ferramentas. Continue assim!

Espero que possa ter lhe ajudado!

Olá, Evandro! Tudo bem?

Muito obrigado pelo feedback e pelas observações.

Tenho tentado justamente ir além do funcionamento básico e começar a pensar mais em legibilidade, manutenção e reaproveitamento da lógica.

Inclusive, apliquei algumas das suas sugestões no exercício mais recente que fiz, chamado “Classificador de consumo elétrico”. Nele, utilizei busca em array (find) para classificar os níveis de consumo com base em ranges de valores - uma alternativa ao uso de vários if/else.

Também implementei async/await no readline em vez do formato tradicional com callbacks, o que me ajudou a entender melhor o fluxo assíncrono e o funcionamento de Promises.

Foi um exercício que rendeu muito mais aprendizado do que eu esperava.

Obrigado novamente pelas dicas e pelo incentivo!