1
resposta

[Projeto] Desafio: Hora da prática

Criar um construtor para a classe Titular, que inicialize todas suas propriedades

class Titular2
{
    public Titular2(string nome, string cpf, string endereco)
    {
        Nome = nome;
        Cpf = cpf;
        Endereco = endereco;
    }

    public string? Nome { get; }
    public string? Cpf { get; }
    public string? Endereco { get; }
}

Criar um construtor para a classe Conta, que inicialize todas suas propriedades

class Conta2
{
    public Titular2 Titular { get; }
    public int Agencia { get; }
    public int NumeroDaConta { get; }
    public double Saldo { get; }
    public double Limite { get; }

    public string Informacoes => $"Conta nº {this.NumeroDaConta}, Agência {this.Agencia}, Titular: {this.Titular.Nome} - Saldo: {this.Saldo}";

    public Conta2(Titular2 titular, int agencia, int numerodaconta, double saldo, double limite)
    {
        Titular = titular;
        Agencia = agencia;
        NumeroDaConta = numerodaconta;
        Saldo = saldo;
        Limite = limite;
    }



    public void ExibirDetalhes ()
    {
        Console.WriteLine($"Nome Titular: {Titular.Nome}");
        Console.WriteLine($"CFP do Titular: {Titular.Cpf}");
        Console.WriteLine($"Endereço do Titular: {Titular.Endereco}");
        Console.WriteLine($"Agência: {Agencia}");
        Console.WriteLine($"Número Da Conta: {NumeroDaConta:D3}");
        Console.WriteLine($"Saldo: {Saldo}");
        Console.WriteLine($"Limite: {Limite}");
    }
}

Instanciar uma Conta e exibir suas informações na tela, utilizando construtores.

var usuario = new Titular2("Sunny", "000.000.000-00", "Empire State Street");


var conta = new Conta2(usuario, 777, 001, 2000.0, 3000.0);

Console.WriteLine($"{conta.Informacoes}\n");
//ou
conta.ExibirDetalhes();

Desenvolver uma classe que representa um catálogo de jogos, com uma lista de Jogos
e métodos para manipular essa lista, bem como um construtor que faça sua
inicialização.

class Jogos
{
    public Jogos(string nome, string genero, int anoLancamento, decimal preco)
    {
        Nome = nome;
        Genero = genero;
        AnoLancamento = anoLancamento;
        Preco = preco;
    }
    public string Nome { get; }
    public string Genero { get; }
    public int AnoLancamento { get; }
    public decimal Preco { get; }

}

class CatalogoJogoss
{
    public CatalogoJogoss()
    {
        CatalogoJogos = new List<Jogos> ();
    }
    public List<Jogos> CatalogoJogos { get; set; }
    public bool CatalogoVazio => CatalogoJogos.Count == 0;

    public void AdicionarJogo(string nome, string genero, int anolancamento, decimal preco)
    {
        Jogos novoJogo = new Jogos(nome, genero, anolancamento, preco);
        CatalogoJogos.Add(novoJogo);
        Console.WriteLine($"Jogo {novoJogo.Nome} adicionado com sucesso!\n");
    }

    public void RemoverJogo(string nome)
    {
        Jogos? jogo = CatalogoJogos.FirstOrDefault(game => game.Nome == nome);
        if (jogo != null)
        {
            CatalogoJogos.Remove(jogo);
        }
        else
        {
            Console.WriteLine("Jogo não encontrado!");
        }
    }

    public void ExibirCatalogo ()
    {
       if (CatalogoVazio)
        {
            Console.WriteLine("\nNão existe nenhum jogo no catálogo atualmente.");
        }
       else
        {
            Console.WriteLine("Catálogo de jogos abaixo: \n");
            foreach (Jogos jogo in CatalogoJogos)
            {
                Console.WriteLine($"Nome: {jogo.Nome}");
                Console.WriteLine($"Gênero: {jogo.Genero}");
                Console.WriteLine($"Ano de Lançamento: {jogo.AnoLancamento}");
                Console.WriteLine($"Preço: ${jogo.Preco}\n");
            }
        }
    }
}

Program.cs

var jogoA = new CatalogoJogoss();


Console.Clear();
jogoA.ExibirCatalogo();
Thread.Sleep(4000);

Console.Clear();
jogoA.AdicionarJogo("Doom", "Ação", 2001, 120.99m);
jogoA.AdicionarJogo("God of War", "Ação", 2015, 200.99m);
jogoA.ExibirCatalogo();
1 resposta

Olá, Christopher! Tudo bem?

Que entrega sensacional! Seu código demonstra um domínio sólido dos fundamentos da Orientação a Objetos em C#. O uso de construtores para garantir que um objeto nasça com um estado válido (com todas as propriedades preenchidas) é uma das melhores práticas de design de software.

Para agregar valor ao seu projeto, quero destacar alguns pontos de excelência na sua implementação:


Destaques do seu código

  • Propriedades Read-only: Nas classes Titular2 e Conta2, você usou propriedades apenas com o get;. Isso é excelente! Ao inicializá-las via construtor, você garante a imutabilidade do objeto após a criação, o que evita bugs onde os dados do titular poderiam ser alterados acidentalmente.
  • Composição de Objetos: Na classe Conta2, você não apenas colocou o nome do titular, mas sim a classe Titular2 completa. Isso é Composição, um pilar da OO que permite que seus objetos sejam mais complexos e organizados.
  • Manipulação de Listas: No catálogo de jogos, você utilizou o FirstOrDefault com uma expressão lambda (game => game.Nome == nome). Isso mostra que você já está confortável com LINQ, o que torna o código muito mais moderno e legível.

Dicas de Ouro para Evolução

  1. Formatação de Moeda: No método ExibirCatalogo, você exibiu o preço com $. No C#, você pode usar o formatador de cultura para que ele coloque o símbolo automaticamente conforme a região do computador:
    • Console.WriteLine($"Preço: {jogo.Preco:C}"); (O :C formata como Currency).
  2. Uso do this: No construtor da Conta2, você nomeou os parâmetros exatamente como as propriedades (ex: agencia). Nesse caso, para o compilador não se confundir, usamos o this:
    • this.Agencia = agencia;
    • Isso ajuda muito na legibilidade, deixando claro que você está atribuindo o valor do parâmetro à propriedade da classe.
  3. Encapsulamento da Lista: No CatalogoJogoss, você deixou a lista como public. Em projetos maiores, costumamos deixá-la como private ou protected para garantir que ninguém de fora consiga dar um .Clear() na lista sem passar pelos seus métodos de controle.

Parabéns pelo uso da Thread.Sleep e Console.Clear para criar uma experiência de usuário (UX) mais dinâmica no console. Isso mostra atenção aos detalhes!

Qual dessas classes você achou mais desafiadora de estruturar: a de gerenciamento de contas ou o catálogo de jogos com listas?