1
resposta

[Sugestão] [Projeto] Desafio: Hora da prática

Atividade 1:

class Titular
{
    private string _nome;
    private string _cpf;
    public string Nome
    {
        get { return _nome; }
        set { _nome = value; }
    }

    public string Cpf
    {
        get { return _cpf; }
        set { _cpf = value; }
    }
}
class Conta
{
    private int _agencia;
    private int _numeroDaConta;
    private decimal _saldo;
    private decimal _limite;

    public Titular Titular;

    public int Agencia
    {
        get { return _agencia; }
        set { _agencia = value; }
    }

    public int NumeroDaConta
    {
        get { return _numeroDaConta; }
        set { _numeroDaConta = value; }
    }

    public decimal Saldo
    {
        get { return _saldo; }
        set { _saldo = value; }
    }

    public decimal Limite
    {
        get { return _limite; }
        set { _limite = value; }
    }

    public void InformacoesDaConta ()
    {
        Console.WriteLine($"Titular da Conta: {Titular}");
        Console.WriteLine($"Agência: {Agencia}");
        Console.WriteLine($"Número da Conta: {NumeroDaConta}");
        Console.WriteLine($"Saldo: {Saldo}");
        Console.WriteLine($"Limite: {Limite}");
    }
}

Atividade 2:

Conta novaConta = new Conta();
novaConta.Titular = new Titular { Nome = "José Willamys", Cpf = "020-145-852-29" };

Console.WriteLine($"Nome do Titular: {novaConta.Titular.Nome}");
Console.WriteLine($"CPF: {novaConta.Titular.Cpf}");

Atividade 3:

class Estoque
{
    List<Produto> estoque = new List<Produto>();

    public void AdicionarProduto (Produto produto)
    {
        estoque.Add(produto);
    }

    public void ListarEstoque ()
    {
        foreach (Produto produto in estoque)
        {
            Console.WriteLine($"Produto: {produto.Nome} | Quantidade: {produto.Quantidade}");
        }
    }
}
class Produto
{
    private string _nome;
    private int _quantidade;

    public string Nome { get; set; }
    public int Quantidade { get; set; }
}
Estoque estoqueDeFrutas = new Estoque();
Produto banana = new Produto { Nome = "Banana", Quantidade = 10 };

estoqueDeFrutas.AdicionarProduto(banana);
estoqueDeFrutas.ListarEstoque();

Atividade 4:

class Aluno
{
    private string _nome;
    private byte _idade;
    private List<double> _notas = new List<double>();

    public string Nome
    {
        get {  return _nome; }
        set { _nome = value; }
    }

    public byte Idade
    {
        get { return _idade; }
        set { _idade = value; }
    }

    public List<double> Notas
    {
        get { return _notas; }
    }

    public double NovaNota
    {
        set { _notas.Add(value); }
    }
}
class Professor
{
    private string _nome;
    private string _disciplinaLecionada;

    public string Nome
    {
        get {  return _nome; }
        set {  _nome = value; }
    }

    public string DisciplinaLecionada
    {
        get { return _disciplinaLecionada; }
        set { _disciplinaLecionada = value; }
    }
}
class Disciplina
{
    Dictionary<string, List<Aluno>> alunosMatriculados = new Dictionary<string, List<Aluno>>();

    private string _nomeDaDisciplina;
    
    public string NomeDaDisciplina
    {
        get { return _nomeDaDisciplina;}
        set {  _nomeDaDisciplina = value;}
    }

    public void AdicionarAluno(Aluno aluno)
    {
        if (alunosMatriculados.TryGetValue(_nomeDaDisciplina, out var list))
        {
            list.Add(aluno);
        }
        else
        {
            alunosMatriculados.Add(_nomeDaDisciplina, new List<Aluno> { aluno });
        }
    }

    public void ExibirLista ()
    {
        Console.WriteLine(_nomeDaDisciplina + "\n");

        foreach (Aluno alunos in alunosMatriculados[_nomeDaDisciplina])
        {
            Console.WriteLine(alunos.Nome);
        }
    }
}
Aluno aluno1 = new Aluno { Nome = "José", Idade = 15, NovaNota = 10};
Aluno aluno2 = new Aluno { Nome = "João", Idade = 14, NovaNota = 8.5 };
Aluno aluno3 = new Aluno { Nome = "Maria", Idade = 13, NovaNota = 9.5 };

Disciplina portugues = new Disciplina { NomeDaDisciplina = "Língua Português"};

portugues.AdicionarAluno(aluno1);
portugues.AdicionarAluno(aluno2);
portugues.AdicionarAluno(aluno3);
portugues.ExibirLista();
1 resposta

Olá, José. Como vai?

Muito bacana a sua iniciativa de compartilhar as suas resoluções do desafio aqui no fórum! O seu código está muito bem estruturado e demonstra que você compreendeu perfeitamente os conceitos de Orientação a Objetos, como o relacionamento entre classes, o encapsulamento com propriedades e a manipulação de coleções como listas e dicionários.

Para agregar ainda mais valor ao seu aprendizado, analisando os seus scripts, separei algumas sugestões de boas práticas e pequenos ajustes que vão deixar o seu código C# ainda mais profissional e limpo:

  • Impressão do Objeto Titular: Na Atividade 1, dentro do método InformacoesDaConta, a linha Console.WriteLine($"Titular da Conta: {Titular}"); vai acabar imprimindo o caminho de referência do objeto na memória (algo como Namespace.Titular) em vez do nome da pessoa. Para corrigir isso e exibir a informação correta, basta acessar a propriedade específica do nome:
Console.WriteLine($"Titular da Conta: {Titular.Nome}");
  • Propriedades Autoimplementadas: Notei uma excelente evolução no seu código da Atividade 1 para a Atividade 3. Na primeira, você utilizou atributos privados (como _nome) e depois criou as propriedades manuais com get e set. Já na Atividade 3, na classe Produto, você utilizou propriedades autoimplementadas (public string Nome { get; set; }). Essa segunda forma é a mais recomendada no C# moderno para casos em que você não precisa fazer nenhuma validação lógica dentro do get ou do set. Você pode aplicar essa mesma lógica limpa da Atividade 3 nas suas classes Titular e Conta, reduzindo drasticamente a quantidade de linhas de código!
  • Métodos vs Propriedades (Apenas Set): Na Atividade 4, a sua solução de criar uma propriedade NovaNota apenas com o set para adicionar valores à lista foi uma sacada muito inteligente e criativa para permitir o uso do inicializador de objetos. No entanto, pensando em boas práticas de design de software (Clean Code), quando queremos executar uma ação que altera o estado interno de um objeto (como adicionar um item a uma lista privada), o ideal é utilizarmos um método.

Veja como a classe Aluno ficaria um pouco mais semântica:

class Aluno
{
    public string Nome { get; set; }
    public byte Idade { get; set; }
    
    private List<double> _notas = new List<double>();
    public List<double> Notas
    {
        get { return _notas; }
    }

    // Criamos um método com um verbo, indicando uma ação clara
    public void AdicionarNota(double nota)
    {
        _notas.Add(nota);
    }
}

Na hora de instanciar, você perderia o atalho do inicializador para a nota, mas ganharia muita clareza no código, chamando aluno1.AdicionarNota(10); logo após criar o objeto.

Continue com essa excelente dedicação e praticando bastante os conceitos. A sua base de Orientação a Objetos está ficando muito sólida!

Espero que possa ter lhe ajudado!