1
resposta

[Projeto] Exercício 13. Validação de entrada para login

import os

DADOS_CADASTRAIS = []


def titulo_em_texto(texto):
    linha = '*' * (len(texto))
    print(linha)
    print(texto)
    print(linha)


def titulo_sistema_de_cadastro():
    titulo_em_texto('Sistema de Cadastro')


def menu_cadastro_username():
    titulo_em_texto('Cadastro de Usuário')
    username = input('Digite seu nome de Usuário: ')
    if len(username) < 5:
        os.system('cls')
        titulo_em_texto('O nome de usuário deve conter pelo menos 5 caracteres.')
        return menu_cadastro_username()
    cadastro_username = {'username': username}
    DADOS_CADASTRAIS.append(cadastro_username)
    os.system('cls')


def menu_cadastro_password():
    titulo_em_texto('Cadastro de Senha')
    password = input('Digite sua Senha: ')
    if len(password) < 8:
        os.system('cls')
        titulo_em_texto('A senha deve conter pelo menos 8 caracteres.')
        return menu_cadastro_password()
    cadastro_password = {'password': password}
    DADOS_CADASTRAIS.append(cadastro_password)


def main():
    os.system('cls')
    titulo_sistema_de_cadastro()
    menu_cadastro_username()
    menu_cadastro_password()
    os.system('cls')
    titulo_em_texto('Cadastro Concluído com Sucesso!')


if __name__ == '__main__':
    main()
1 resposta

Oii, Daniel! Tudo bem?

A sua solução para o desafio de validação demonstra um nível de organização bem avançado. É muito interessante ver como você utilizou a modularização com funções pra separar cada etapa do processo de cadastro.

Sua abordagem trouxe uma interface mais limpa ao utilizar o comando para limpar o terminal e criar molduras para os títulos, o que melhora bastante a experiência de quem usa o programa.

  • Modularização: Você dividiu o problema em funções específicas (menu_cadastro_username, menu_cadastro_password), o que facilita a leitura e a manutenção futura.
  • Identidade visual: A criação da função titulo_em_texto para padronizar os cabeçalhos ajuda a manter uma estética organizada no console.
  • Uso de recursão: Você utilizou chamadas recursivas para repetir a solicitação caso os dados sejam inválidos, garantindo que o programa não avance sem os critérios atendidos.

Ponto de Atenção: O Laço While

Embora sua lógica funcione através da recursão, o desafio solicitava especificamente o uso de um laço while.

Em Python, pra sistemas de entrada de dados, o while costuma ser preferido em vez da recursão por alguns motivos técnicos:

  1. Limite de memória: Se alguém errar o nome de usuário centenas de vezes seguidas, a recursão pode causar um estouro de pilha (stack overflow), enquanto o while pode rodar indefinidamente sem problemas.
  2. Estrutura da lista: No seu código, cada erro gera uma nova chamada que mantém a anterior "aberta" na memória até que a última seja concluída.

Você pode manter sua estrutura de funções, mas utilizar o laço para controlar as tentativas de forma mais linear:

def menu_cadastro_username():
    while True: # O laço substitui a necessidade de chamar a função dentro dela mesma
        titulo_em_texto('Cadastro de Usuário')
        username = input('Digite seu nome de Usuário: ')
        if len(username) >= 5:
            DADOS_CADASTRAIS.append({'username': username})
            os.system('cls')
            break # Sai do laço apenas quando for válido
        
        os.system('cls')
        titulo_em_texto('O nome de usuário deve conter pelo menos 5 caracteres.')

Parabéns pela excelente estrutura de projeto e pelo cuidado com a apresentação visual no terminal.

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