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!