1
resposta

[Projeto] Saudação personalizada

// Saudação personalizada

string nomeDoUsuario, saudacao;
byte periodoDoDia;


// função para controlar o fluxo de interação da Lura IA
void AcoesDaIa ()
{
    Console.WriteLine("Ola, me chamo Lura!");
    Console.WriteLine("Informe-me em que período do dia você está.\n");
    Console.WriteLine("Manhã - 1");
    Console.WriteLine("Tarde - 2");
    Console.WriteLine("Noite - 3");
    periodoDoDia = ValidarDadoNumerico();
    Console.WriteLine("Agora preciso que me informe o seu nome:");
    nomeDoUsuario = ValidarString();
    saudacao = MensagemDeSaudacao(periodoDoDia, nomeDoUsuario);
    Console.WriteLine(saudacao);
    Console.WriteLine("Estou pronta para conversar com você!");
}

string MensagemDeSaudacao (byte opcao, string nome)
{
    string saudacao = opcao switch
    {
        1 => $"Bom dia, como posso te ajudar {nome} ?",
        2 => $"Boa tarde, como posso te ajudar {nome} ?",
        3 => $"Boa noite, como posso te ajudar {nome} ?",
        _ => throw new InvalidOperationException("Valor inesperado recebido.")
    };

    return saudacao;
}

// funções para validar os dados enviados pelos usuários

string ValidarString ()  
{
    while(true)
    {
        string entrada = Console.ReadLine()!;

        if(!string.IsNullOrWhiteSpace(entrada))
        {
            return entrada;
        }
        
        Console.WriteLine("Informação inválida, insira seu nome:");
    }
}

byte ValidarDadoNumerico ()
{   
    while(true)
    {
        string entrada = Console.ReadLine()!;

        if (byte.TryParse(entrada, out byte dadoValido) && "123".Contains(entrada))
        {
            return dadoValido;
        }

        Console.WriteLine("Insira uma opção válida (1 - 2 - 3):");
    }
}

AcoesDaIa();
1 resposta

Olá, José. Como vai?

Parabéns pela excelente implementação do projeto! É muito gratificante ver como você utilizou recursos modernos da linguagem C#, como o Switch Expression (introduzido no C# 8.0), para tornar seu código muito mais conciso e legível.

Gostaria de destacar alguns pontos técnicos de alto nível na sua solução:

  • Validação de Dados: O uso de loops while(true) com byte.TryParse é uma boa prática essencial. Isso evita que o programa sofra um crash caso o usuário digite uma letra onde se espera um número, garantindo a resiliência do software.
  • Switch Expression: A sua função MensagemDeSaudacao ficou extremamente limpa. Ao contrário do switch tradicional, a expressão que você usou é perfeita para atribuições diretas, reduzindo o excesso de código (boilerplate).
  • Tratamento de Exceções: Ao utilizar o _ => throw new InvalidOperationException(), você seguiu o princípio de "falhar rápido" (fail-fast), o que ajuda muito na identificação de bugs durante o desenvolvimento.

Para agregar ainda mais valor ao seu aprendizado, deixo aqui uma pequena sugestão de refatoração para a sua validação numérica. No trecho "123".Contains(entrada), você está comparando strings. Uma alternativa mais tipada e robusta seria verificar o valor numérico diretamente:

// Uma forma alternativa e comum em C#:
if (byte.TryParse(entrada, out byte dadoValido) && (dadoValido >= 1 && dadoValido <= 3))
{
    return dadoValido;
}

Além disso, notei que você utilizou o operador ! (null-forgiving) em Console.ReadLine()!. Isso mostra que você já está atento aos Nullable Reference Types, uma funcionalidade importante para evitar o famoso erro de referência nula.

Seu projeto demonstra uma ótima base lógica e um bom entendimento da sintaxe da linguagem. Continue praticando essa organização de funções, pois ela é a base para criar sistemas complexos e de fácil manutenção!

Espero que possa ter lhe ajudado!