Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

2
respostas

[Projeto] Desafio: hora da prática

Decidi fazer um sistema básico de login e cadastro de usuário, deixarei o código logo abaixo:

class Usuarios
{
    private List<Usuario> _usuariosRegistrados = [];

    public IReadOnlyList<Usuario> listaDeUsuarios => _usuariosRegistrados;

    public void AdicionarUsuario(Usuario usuario)
    {
        _usuariosRegistrados.Add(usuario);
    }

    public void RemoverUsuario(Usuario usuario)
    {
        _usuariosRegistrados.Remove(usuario);
    }

    public Usuario BuscarUsuarioPorNome(string nome)
    {
        return _usuariosRegistrados.FirstOrDefault(u => u.Nome == nome)!;
    }

    public Usuario BuscarUsuarioPorEmail(string email)
    {
        return _usuariosRegistrados.FirstOrDefault(u => u.Email == email)!;
    }

    public bool ExisteEmail(string email)
    {
        return _usuariosRegistrados.Any(u => u.Email == email);
    }

    public bool BuscarUsuario(string nome)
    {
        return _usuariosRegistrados.Any(u => u.Nome == nome);
    }
}
class Usuario
{    
    public Usuario(string nome, string email, string senha)
    {
        Nome = nome;
        Email = email;
        Senha = senha;
    }

    public string Nome { get; }
    public string Email { get; }
    public string Senha { get; private set; }

    public void AlterarSenha(string novaSenha)
    {
        Senha = novaSenha;
    }
}
class Validacao
{
    public (bool valido, string stringValida) ValidarString(string entrada)
    {
        bool valido = !string.IsNullOrWhiteSpace(entrada);
        return (valido, entrada);
    }

    public bool ConfirmarSenha(string novaSenha, string RepetirSenha)
    { 
        return novaSenha == RepetirSenha;
    }

    public (bool valido, int valor) ConversaoInt(string entrada)
    {
        bool valido = int.TryParse(entrada, out int resultado);
        return (valido, resultado);
    }

    public (bool valido, string stringValida) VerificarDadosNoRepositorio(Validacao validar, Usuarios usuarios, string dadoBuscado)
    {
        string entrada = Console.ReadLine()!;
        var entradaValida = validar.ValidarString(entrada);

        bool validarInformacao;
        if (dadoBuscado == "nome")
        {
            validarInformacao = usuarios.BuscarUsuario(entradaValida.stringValida);
        }
        else
        {
            validarInformacao = usuarios.ExisteEmail(entradaValida.stringValida);
        }
        
        
        return (validarInformacao, entradaValida.stringValida);
    }
}
2 respostas
class ConsoleApp
{
    public ConsoleApp(Usuarios usuarios)
    {
        _usuarios = usuarios;
    }

    private Usuarios _usuarios { get; }
    private Validacao _validar = new Validacao();

    public void MenuPrincipal()
    {
        Console.Clear();
        Console.WriteLine("EFETUAR LOGIN OU CADASTRAR NOVO USUÁRIO\n");
        Console.WriteLine("1 - LOGIN");
        Console.WriteLine("2 - CADASTRAR");
        Console.WriteLine("3 - SAIR");
        Console.Write("\nSelecione a opção desejada (1-2-3): ");
        ControleDoFluxoDoMenu();
    }

    public void LogarUsuario()
    {
        Console.Clear();
        Console.WriteLine("LOGIN");
        Console.Write("Nome de usuário: ");
        string nomeUsuario = Console.ReadLine()!;
        var nome = _validar.ValidarString(nomeUsuario);
        Console.Write("Senha: ");
        string senhaUsuario = Console.ReadLine()!;
        var senha = _validar.ValidarString(senhaUsuario);
        Usuario validarLogin = _usuarios.BuscarUsuarioPorNome(nome.stringValida);
        
        if (validarLogin != null)
        {
            if (validarLogin.Senha == senha.stringValida)
            {
                Console.WriteLine("Login efetuado com sucesso!");
                Console.WriteLine($"Bem vindo {validarLogin.Nome}!");
            }
            else
            {
                Console.WriteLine("Senha inválida");
            }
        }
        else
        {
            Console.WriteLine("Usuário não encontrado.");
        }
    }

    public void CadastarUsuario()
    {
        Console.Clear();
        Console.WriteLine("CADASTRO");
        Console.Write("Nome de usuário: ");

        var nomeUsuario = _validar.VerificarDadosNoRepositorio(_validar, _usuarios, "nome");
        while (nomeUsuario.valido)
        {
            Console.WriteLine($"O nome {nomeUsuario.stringValida} esta em uso. Tente outro nome.");
            nomeUsuario = _validar.VerificarDadosNoRepositorio(_validar, _usuarios, "nome");
        }

        Console.Write("E-mail: ");
        var emailUsuario = _validar.VerificarDadosNoRepositorio(_validar, _usuarios, "email");
        while (emailUsuario.valido)
        {
            Console.WriteLine($"O nome {emailUsuario.stringValida} esta em uso. Tente outro nome.");
            emailUsuario = _validar.VerificarDadosNoRepositorio(_validar, _usuarios, "email");
        }

        string senhaUsuario;
        string repetirSenha;
        while (true)
        {
            Console.Write("Senha:");
            var validarSenha = _validar.ValidarString(Console.ReadLine()!);
            
            Console.Write("Repetir senha:");
            var validarRepetirSenha = _validar.ValidarString(Console.ReadLine()!);

            if (validarSenha.valido && validarRepetirSenha.valido)
            {
                senhaUsuario = validarSenha.stringValida;
                repetirSenha = validarRepetirSenha.stringValida;
                if (_validar.ConfirmarSenha(senhaUsuario, repetirSenha))
                {
                    break;
                }
                else
                {
                    Console.WriteLine("As senhas não coincidem. Digite novamente.");
                }
            }
            else
            {
                Console.WriteLine("Espaços em branco não são permitidos como senha.");
            }
        }

        Usuario novoUsuario = new Usuario(nomeUsuario.stringValida, emailUsuario.stringValida, senhaUsuario);
        _usuarios.AdicionarUsuario(novoUsuario);

        Console.WriteLine("Cadastro efetuado com sucesso!");
        Thread.Sleep(2500);
        MenuPrincipal();
    }

    public void ControleDoFluxoDoMenu()
    {
        while (true)
        {   
            string opcao = Console.ReadLine()!;
            var dados = _validar.ConversaoInt(opcao);

            if (dados.valido && (dados.valor >= 1 && dados.valor <= 3))
            {
                switch (dados.valor)
                {
                    case 1: LogarUsuario(); break;
                    case 2: CadastarUsuario(); break;
                    case 3:
                        Console.WriteLine("\nSistema finalizado.");
                        Environment.Exit(0); 
                        break;
                    default: break;
                }
                break;
            }

            Console.WriteLine("Opção inválida, tente novamente: ");
        }
    }
}

Olá, José!

Sobre o seu Desafio: hora da prática, seu sistema básico de login e cadastro ficou bem interessante para treinar Orientação a Objetos em C#.

Você separou bem as responsabilidades entre Usuario, Usuarios, Validacao e ConsoleApp, o que mostra uma boa noção de organização do projeto.
Uma dica interessante para o futuro é evitar o uso de ! após FirstOrDefault, retornando Usuario? quando a busca pode não encontrar ninguém. Veja este exemplo:


public Usuario? BuscarUsuarioPorNome(string nome)
{
    return _usuariosRegistrados.FirstOrDefault(usuario => usuario.Nome == nome);
}

Esse código indica que o retorno pode ser nulo, deixando a validação mais segura antes de acessar dados como Senha ou Nome. Você pretende evoluir esse projeto adicionando validação de e-mail ou armazenamento dos usuários em arquivo?

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!