1
resposta

[Projeto] Faça como eu fiz: controle de matrícula


class Curso
{
    private List<Estudante> matriculas = new();

    public Curso(string nome, int vagasTotais)
    {
        Nome = nome;
        VagasTotais = vagasTotais;
    }

    public string Nome { get; private set; }
    public int VagasTotais  { get; private set; }
    public int VagasDisponiveis => VagasTotais - matriculas.Count;

    public bool Matricular(Estudante estudante)
    {
        if(VagasDisponiveis == 0)
        {
            Console.WriteLine("Erro: Não há vagas disponíveis para este curso.");
            return false;
        }
        else
        {
            matriculas.Add(estudante);
            Console.WriteLine("Estudante matriculado com sucesso.");
        }

        return true;
    }

    public void ListarMatriculados()
    {
        Console.WriteLine($"Estudantes matriculados em {Nome}:");
        foreach (var item in matriculas)
        {
            Console.WriteLine(item.Nome);
        }
        Console.WriteLine($"Vagas disponíveis: {VagasDisponiveis}");
    }
}

class Estudante
{
    public Estudante(string nome)
    {
        Nome = nome;
    }

    public string Nome { get; private set; }
}

Curso curso = new Curso("Lógica de Programação", 2);
curso.Matricular(new Estudante("Rafaela"));
curso.Matricular(new Estudante("João"));
curso.Matricular(new Estudante("Mirela")); // excede o limite
curso.ListarMatriculados();
1 resposta

Olá, Eduardo. Como vai?

Parabéns por fechar essa sequência de projetos com chave de ouro! Este exercício de controle de matrícula consolida perfeitamente como o encapsulamento protege não apenas dados simples, mas as regras de negócio de um sistema inteiro.

Ao criar a propriedade VagasDisponiveis como uma conta baseada no estado interno da lista matriculas, você aplicou o conceito de "fonte única da verdade". Isso garante que o sistema nunca entre em um estado inconsistente, como ter mais alunos do que vagas.

Pontos de destaque na sua solução:

  • Propriedades Calculadas: O uso de VagasDisponiveis => VagasTotais - matriculas.Count; é a forma mais limpa e segura de expor essa informação. O valor é sempre recalculado em tempo real, evitando que você precise atualizar uma variável manual toda vez que alguém se matricula.
  • Controle de Fluxo: O método Matricular retornar um bool e fazer a verificação de vagas antes de adicionar à lista é o "coração" do encapsulamento. A classe Curso é a única responsável por decidir se alguém pode ou não entrar.
  • Interação entre Objetos: Você demonstrou maturidade ao separar a entidade Estudante da entidade Curso, permitindo que o curso gerencie uma coleção de objetos complexos.

Uma pequena sugestão de segurança:

Atualmente, se alguém tentar matricular o mesmo objeto Estudante duas vezes, seu código permitirá (desde que haja vaga). Para tornar o sistema ainda mais profissional, você poderia adicionar uma verificação de duplicidade:

public bool Matricular(Estudante estudante)
{
    if (VagasDisponiveis == 0) { /* erro de vagas */ }
    
    // Verifica se o estudante já está na lista
    if (matriculas.Contains(estudante))
    {
        Console.WriteLine("Erro: Estudante já matriculado neste curso.");
        return false;
    }

    matriculas.Add(estudante);
    return true;
}

Eduardo, sua jornada por este curso mostra um domínio muito sólido de C# e Orientação a Objetos. Você está escrevendo código que não apenas "funciona", mas que é sustentável e seguro.

Espero que possa ter lhe ajudado!