1
resposta

[Dúvida] Realização do quarto exercício.

Prezados, boa tarde! Aqui está a minha solução do quarto desafio, e eu gostaria de saber se o código está correto, e se possível, eu também gostaria de algumas dicas para deixar o código mais enxuto.

// TODO: Criar um programa que simule um sistema de login utilizando um dicionário para armazenar nomes de usuário e senhas.

Dictionary<string, string> credenciais = [];

bool sairDoPrograma = false;

while (!sairDoPrograma) { Console.Clear();

Console.WriteLine("Sistema de login e senha\n");
Console.WriteLine("1. Efetuar login");
Console.WriteLine("2. Cadastrar novo usuário");
Console.WriteLine("3. Sair do programa");

Console.Write("\nEscolha uma opção: ");
int opt = int.Parse(Console.ReadLine()!);

Console.Clear();

switch (opt)
{
    case 1:
        if (credenciais.Count == 0)
        {
            Console.WriteLine("Não existe nenhum usuário cadastrado. Favor realizar cadastro no sistema!");
            Console.Write("\nPressione qualquer tecla para continuar");
            Console.ReadKey();
        }
        else
        {

            Console.WriteLine("Insira suas credenciais\n");

            Console.Write("Login: ");
            string login = Console.ReadLine()!;

            if (credenciais.ContainsKey(login))
            {
                Console.Write("Senha: ");
                string senha = Console.ReadLine()!;

                if (credenciais[login] == senha)
                {
                    Console.WriteLine("Login realizado com sucesso!");
                    Console.Write("\nPressione qualquer tecla para continuar");
                    Console.ReadKey();

                }
                else
                {
                    Console.WriteLine("Senha incorreta.");
                    Console.Write("\nPressione qualquer tecla para continuar");
                    Console.ReadKey();
                }
            }
            else
            {
                Console.WriteLine("Login incorreto.");
                Console.Write("\nPressione qualquer tecla para continuar");
                Console.ReadKey();
            }
        }
        break;

    case 2:
        Console.WriteLine("Cadastrando um novo usuário\n");

        Console.Write("Login: ");
        string novoLogin = Console.ReadLine()!;

        Console.Write("Senha: ");
        string novaSenha = Console.ReadLine()!;

        credenciais!.Add(novoLogin, novaSenha);
        Console.WriteLine("Cadastro realizado com sucesso!");
        Console.Write("\nPressione qualquer tecla para continuar");
        Console.ReadKey();
        break;
    case 3:
        Console.WriteLine("Fechando o programa..");
        Console.Write("\nPressione qualquer tecla para continuar");
        Console.ReadKey();
        Console.Clear();
        sairDoPrograma = true;
        break;
    default:
        Console.WriteLine("Opção invalida.");
        break;

}

}

1 resposta

Oi, seu código está bem estruturado, mas aqui estão algumas sugestões para melhorá-lo e deixá-lo mais enxuto:

  1. Inicialização do dicionário: No seu código, a variável credenciais está sendo inicializada como [], o que não é válido em C#. Ela deve ser inicializada como um novo dicionário: new Dictionary<string, string>().

  2. Evitar uso de Console.Clear() repetidamente: Em vez de limpar a tela várias vezes dentro do while, você pode agrupar o que deve ser exibido e só limpar no início de cada iteração.

  3. Evitar repetição de código: A parte do código que exibe a mensagem para pressionar qualquer tecla pode ser centralizada em um método para não se repetir.

  4. Uso do switch: O seu switch está funcionando bem, mas a parte onde você trata a opção inválida pode ser mais eficiente com uma mensagem genérica que avisa que a opção é inválida sem precisar repetir esse código.

Aqui está a versão otimizada:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Dictionary<string, string> credenciais = new Dictionary<string, string>();
        bool sairDoPrograma = false;

        while (!sairDoPrograma)
        {
            MostrarMenu();

            int opt = int.Parse(Console.ReadLine()!);
            Console.Clear();

            switch (opt)
            {
                case 1:
                    EfetuarLogin(credenciais);
                    break;

                case 2:
                    CadastrarUsuario(credenciais);
                    break;

                case 3:
                    sairDoPrograma = SairDoPrograma();
                    break;

                default:
                    Console.WriteLine("Opção inválida.");
                    AguardarTecla();
                    break;
            }
        }
    }

    static void MostrarMenu()
    {
        Console.Clear();
        Console.WriteLine("Sistema de login e senha\n");
        Console.WriteLine("1. Efetuar login");
        Console.WriteLine("2. Cadastrar novo usuário");
        Console.WriteLine("3. Sair do programa");
        Console.Write("\nEscolha uma opção: ");
    }

    static void EfetuarLogin(Dictionary<string, string> credenciais)
    {
        if (credenciais.Count == 0)
        {
            Console.WriteLine("Não existe nenhum usuário cadastrado. Favor realizar cadastro no sistema!");
            AguardarTecla();
        }
        else
        {
            Console.WriteLine("Insira suas credenciais\n");

            Console.Write("Login: ");
            string login = Console.ReadLine()!;

            if (credenciais.ContainsKey(login))
            {
                Console.Write("Senha: ");
                string senha = Console.ReadLine()!;

                if (credenciais[login] == senha)
                {
                    Console.WriteLine("Login realizado com sucesso!");
                    AguardarTecla();
                }
                else
                {
                    Console.WriteLine("Senha incorreta.");
                    AguardarTecla();
                }
            }
            else
            {
                Console.WriteLine("Login incorreto.");
                AguardarTecla();
            }
        }
    }

    static void CadastrarUsuario(Dictionary<string, string> credenciais)
    {
        Console.WriteLine("Cadastrando um novo usuário\n");

        Console.Write("Login: ");
        string novoLogin = Console.ReadLine()!;

        Console.Write("Senha: ");
        string novaSenha = Console.ReadLine()!;

        credenciais.Add(novoLogin, novaSenha);
        Console.WriteLine("Cadastro realizado com sucesso!");
        AguardarTecla();
    }

    static bool SairDoPrograma()
    {
        Console.WriteLine("Fechando o programa..");
        AguardarTecla();
        return true;
    }

    static void AguardarTecla()
    {
        Console.Write("\nPressione qualquer tecla para continuar");
        Console.ReadKey();
    }
}

Alterações principais:

  1. Funções auxiliares: Separei o código em métodos auxiliares (MostrarMenu, EfetuarLogin, CadastrarUsuario, SairDoPrograma, e AguardarTecla) para evitar repetição e melhorar a legibilidade.
  2. Estrutura do dicionário: O dicionário credenciais foi corretamente inicializado.
  3. Limpeza da tela: Agora, a tela é limpa apenas no início do loop principal para reduzir a quantidade de vezes que a tela é limpa, tornando o código mais eficiente.

Essa versão está mais enxuta e reutilizável. Se precisar de mais ajuda, é só avisar!