1
resposta

[Sugestão] Mão na massa: refatorando uma função

main.py

from musica import menu

menu()

musica.py

class Musica:
    lista_musica = []
    def __init__(self, nome, artista, duracao):
        self.nome = nome
        self.artista = artista
        self.duracao = duracao
        Musica.lista_musica.append(self)
    def __str__(self):
        self.nome
        self.artista
        self.duracao


def menu():
    print('\nMenu de musicas\n')
    print('1.Cadastrar musica.')
    print('2.Listar musicas.')
    print()
    selecionado = input('Digite uma opção: ')
    opcoes(selecionado)

def opcoes(selecionado):
    if selecionado == '1':
        cadatra_musica()
    elif selecionado == '2':
        listar_musicas()
    else:
        print('Opção inválida')

def voltar_menu ():
    input('Digite um tecla para voltar par ao menu principal: ')
    menu()

def cadatra_musica():
    try:
        print('\nCadastro de musica.\n')
        nome = input('Digite o nome da musica: ')
        artista = input('Digite o nome do artista: ')
        duracao = int(input('Digite a duração da musica: '))
        Musica(nome, artista, duracao)
        print(f'Musica {nome} cadastrada.')
        voltar_menu()

    except ValueError:
        print('Valor inválido para duração, digite a duração em segundos! Tente novamente.')
    return cadatra_musica()

def listar_musicas():
    contador = 1
    print('\nMusicas cadastradas:\n')
    for musica in Musica.lista_musica:
        print(f'Musica {contador}:\n')
        print(f'Nome:{musica.nome}')
        print(f'Artista: {musica.artista}')
        print(f'Duração: {musica.duracao}')
        contador = contador + 1
    
    voltar_menu()


1 resposta

Oii, William.

Parabéns pela iniciativa de praticar a refatoração do código! É assim que se constrói uma base sólida na programação orientada a objetos. Notei que você buscou estruturar um sistema de menu para gerenciar suas músicas, o que é excelente para aplicar os conceitos de forma prática.

Analisando o seu arquivo musica.py, identifiquei alguns pontos que podem ser ajustados para que o código funcione conforme o esperado e siga as boas práticas do Python.

O método __str__ deve retornar uma string que represente o objeto. No seu código, você apenas listou os atributos, o que causaria um erro ou não teria o efeito desejado ao tentar imprimir o objeto diretamente.

Na função cadatra_musica, o uso de return cadatra_musica() dentro do bloco except ou ao final pode criar um loop infinito ou causar um erro de profundidade de recursão se houver muitos erros de digitação. O ideal é usar uma estrutura de repetição simples.

Se quiser ver uma ideia de como deixar o código:

class Musica:
    lista_musica = []

    def __init__(self, nome, artista, duracao):
        self.nome = nome
        self.artista = artista
        self.duracao = duracao
        Musica.lista_musica.append(self)

    def __str__(self):
        return f'{self.nome} | {self.artista} | {self.duracao} segundos'

def menu():
    print('\n*** Menu de Músicas ***\n')
    print('1. Cadastrar música')
    print('2. Listar músicas')
    print('3. Sair')
    
    selecionado = input('\nDigite uma opção: ')
    opcoes(selecionado)

def opcoes(selecionado):
    if selecionado == '1':
        cadastra_musica()
    elif selecionado == '2':
        listar_musicas()
    elif selecionado == '3':
        print('Encerrando o programa.')
    else:
        print('Opção inválida')
        voltar_menu()

def voltar_menu():
    input('\nPressione qualquer tecla para voltar ao menu principal: ')
    menu()

def cadastra_musica():
    print('\n--- Cadastro de Música ---')
    nome = input('Digite o nome da música: ')
    artista = input('Digite o nome do artista: ')
    
    try:
        duracao = int(input('Digite a duração da música (em segundos): '))
        Musica(nome, artista, duracao)
        print(f'\nMúsica "{nome}" cadastrada com sucesso!')
    except ValueError:
        print('Erro: A duração deve ser um número inteiro.')
    
    voltar_menu()

def listar_musicas():
    print('\n--- Músicas Cadastradas ---')
    if not Musica.lista_musica:
        print('Nenhuma música cadastrada no momento.')
    else:
        for i, musica in enumerate(Musica.lista_musica, start=1):
            print(f'{i}. {musica}')
    
    voltar_menu()

O que foi alterado:

  • Método __str__: Agora ele retorna uma string formatada. Isso permite que você use print(musica) e veja os dados organizados.
  • Função enumerate: No método listar_musicas, usei o enumerate para gerar o contador automaticamente, deixando o código mais limpo.
  • Tratamento de erros: O try/except foca apenas na conversão da duração, que é o ponto onde o erro costuma ocorrer.
  • Condicional de lista vazia: Adicionei uma verificação para informar se não houver músicas cadastradas, evitando que a tela fique em branco.
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!