1
resposta

[Dúvida] Explicação?

Poderiam me explicar um pouco dessa aula ainda fiquei com duvida.

1 resposta

Olá, Levi.

Tudo bem?

Entendo que a aula sobre "Removendo o switch" pode ser um pouco densa, então vou tentar explicar de uma maneira mais clara.

Contexto

A ideia principal dessa aula é refatorar o código para usar herança e polimorfismo, eliminando a necessidade de um grande bloco switch no arquivo Program.cs. Isso torna o código mais limpo e fácil de manter.

Passos para Refatoração

  1. Criar um Método Virtual no Ancestral: No arquivo Menu.cs, criamos um método Executar() que pode ser sobrescrito pelas classes descendentes. Usamos a palavra-chave virtual para indicar que esse método pode ser sobrescrito.

    internal class Menu
    {
        public virtual void Executar(Dictionary<string, Banda> bandasRegistradas)
        {
            Console.Clear();
        }
    }
    
  2. Sobrescrever o Método nas Classes Descendentes: Nas classes descendentes, como MenuExibirDetalhes, usamos a palavra-chave override para sobrescrever o método Executar() do ancestral. Também usamos base.Executar(bandasRegistradas) para chamar o método do ancestral, garantindo que o Console.Clear() seja executado.

    internal class MenuExibirDetalhes : Menu
    {
        public override void Executar(Dictionary<string, Banda> bandasRegistradas)
        {
            base.Executar(bandasRegistradas);
            ExibirTituloDaOpcao("Exibir detalhes da banda");
            // Resto do código...
        }
    }
    
  3. Remover o Bloco Switch no Program.cs: No arquivo Program.cs, substituímos o bloco switch por um dicionário que mapeia as opções do menu para instâncias das classes de menu. Isso elimina a necessidade de criar múltiplos objetos manualmente.

    if (opcoes.ContainsKey(opcaoEscolhidaNumerica))
    {
        Menu menuASerExibido = opcoes[opcaoEscolhidaNumerica];
        menuASerExibido.Executar(bandasRegistradas);
        if (opcaoEscolhidaNumerica > 0) ExibirOpcoesDoMenu();
    }
    else
    {
        Console.WriteLine("Opção inválida");
    }
    

Exemplo Prático

Vamos supor que você queira exibir detalhes de uma banda. Antes, você teria um caso específico no switch para isso. Agora, com a refatoração, o código se torna mais simples e genérico:

  • Antes (com switch):

    case 5:
        MenuExibirDetalhes menu5 = new();
        menu5.Executar(bandasRegistradas);
        ExibirOpcoesDoMenu();
        break;
    
  • Depois (com dicionário):

    if (opcoes.ContainsKey(opcaoEscolhidaNumerica))
    {
        Menu menuASerExibido = opcoes[opcaoEscolhidaNumerica];
        menuASerExibido.Executar(bandasRegistradas);
        if (opcaoEscolhidaNumerica > 0) ExibirOpcoesDoMenu();
    }
    

Com essas mudanças, o código fica mais organizado e fácil de entender. Cada menu específico trata apenas da sua própria lógica, enquanto a lógica comum é tratada na classe ancestral Menu.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.