1
resposta

[Dúvida] Exercício: Exibindo mensagens com forEach()

Gostaria de saber se a função validarMsg está simplificada demais ao ponto de prejudicar a legibilidade e se posso continuar usando assim, ou melhor deixar funções como essa para casos especificos?

import { createInterface } from "readline";

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

const perguntar = (pergunta) => {
  return new Promise((resolve) => {
    rl.question(pergunta, resolve);
  });
};

const validarMsg = (input) =>
  input.length < 2 ? null : input[0].toUpperCase() + input.slice(1);

//Exercício exigia uso do forEach
const exibirMsg = (listaMsgs) => {
  listaMsgs.forEach((mensagem) => console.log("Notificação: " + mensagem));
};

const main = async () => {
  try {
    console.log("Insira abaixo as mensagens. ('fim' encerra inserções)");

    const listaMsgs = [];

    while (true) {
      const input = (await perguntar("> ")).trim().toLowerCase();

      if (input === "fim") break;

      const mensagem = validarMsg(input);

      if (mensagem === null) {
        console.log("A mensagem deve ter mais de 1 caractere");
        continue;
      }

      listaMsgs.push(mensagem);
    }

    exibirMsg(listaMsgs);
  } catch (err) {
    console.log("Algo deu errado. Reinicie a aplicação.");
  } finally {
    rl.close();
  }
};

main();
1 resposta

Olá, Vitor. Como vai?

Essa é uma excelente dúvida! A função validarMsg que você escreveu utiliza uma combinação de Arrow Function com Operador Ternário. Essa abordagem é muito comum no desenvolvimento moderno de JavaScript, especialmente quando trabalhamos com funções utilitárias que realizam transformações simples.

Para responder sua pergunta: não, ela não está simplificada ao ponto de prejudicar a legibilidade, mas existem alguns pontos a considerar sobre quando usar esse estilo.

Quando o estilo "One-Liner" é indicado?

O uso de funções de uma única linha é excelente para transformações de dados (como formatação de strings ou cálculos matemáticos) porque elas reduzem o "ruído" no código. No seu caso, a lógica é clara: se for menor que 2, retorna null, caso contrário, formata a string.

Pontos de atenção sobre legibilidade

Embora esteja correta, aqui estão algumas sugestões para decidir quando manter ou expandir uma função assim:

  • Densidade de operações: Na parte do else do seu ternário, você está fazendo três coisas: acessando o índice [0], transformando em toUpperCase() e concatenando com slice(1). Para muitos desenvolvedores, quando uma linha começa a ultrapassar 80 caracteres ou realiza muitas manipulações de string, quebrar em um bloco { } com variáveis intermediárias pode ajudar quem está lendo pela primeira vez.
  • Semântica do Retorno: Retornar null é uma prática válida, mas em validações mais complexas, costumamos retornar um objeto com o status da validação (ex: { valido: false, erro: 'Mensagem curta' }).

Sugestão de Refatoração Didática

Se você sentir que a linha está ficando "poluída", pode usar a desestruturação de strings para torná-la mais elegante:

const validarMsg = (input) => {
  if (input.length < 2) return null;
  
  const [primeiraLetra, ...resto] = input;
  return primeiraLetra.toUpperCase() + resto.join('');
};

Uso do forEach()

No seu código, o uso do forEach dentro de exibirMsg está perfeito para o propósito do exercício. Como o objetivo é apenas causar um "efeito colateral" (imprimir no console) e não transformar o array em um novo objeto, o forEach é exatamente a ferramenta correta.

Em resumo: você pode continuar usando funções simplificadas para lógicas diretas. Se a lógica começar a exigir muitos "e" (&&) ou "ou" (||) dentro do ternário, aí sim é hora de voltar para o formato tradicional de função.

Espero que possa ter lhe ajudado!