1
resposta

[Projeto] Desafio: hora da prática (Jogos)

Classes

public class Jogos
{
    public Jogos(string nome, int quantidadeJogadores, string dificuldade)
    {
        Nome = nome;
        QuantidadeJogadores = quantidadeJogadores;
        Dificuldade = dificuldade;
    }

    public string Nome { get; }
    public int QuantidadeJogadores { get; }
    public string Dificuldade { get; }
    public string Informacoes => $"{Nome} - {QuantidadeJogadores} jogadores - Dificuldade: {Dificuldade}"; 
}
public class CatalogoJogos
{
    public List<Jogos> CatalogodeJogos = new List<Jogos>();
    public void AdicionarJogo(Jogos jogo)
    {
        CatalogodeJogos.Add(jogo);
    }
    public void ExibirCatalogo()
    {
        Console.WriteLine("====== CATÁLOGO DE JOGOS ======\n");
        if (!CatalogodeJogos.Any())
        {
            Console.WriteLine("Nenhum jogo cadastrado.");
            return;
        }

        foreach (var jogo in CatalogodeJogos)
        {
            Console.WriteLine(jogo.Informacoes);
        }

    }
}

Program.cs

CatalogoJogos cj = new CatalogoJogos();
Jogos jogo1 = new Jogos("The Legend of Zelda: Breath of the Wild", 1, "Médio");
Jogos jogo2 = new Jogos("Among Us", 4, "Fácil");
Jogos jogo3 = new Jogos("Dark Souls III", 1, "Difícil");

cj.AdicionarJogo(jogo1);
cj.AdicionarJogo(jogo2);
cj.AdicionarJogo(jogo3);

cj.ExibirCatalogo();
1 resposta

Olá, Giseli. Como vai?

Parabéns pelo excelente código! Sua implementação do desafio está impecável e demonstra que você compreendeu muito bem os fundamentos da Orientação a Objetos em C#.

Você aplicou conceitos importantíssimos de forma correta, como:

  • Encapsulamento e Propriedades Somente Leitura: O uso do construtor para inicializar propriedades que possuem apenas o get protege os dados do jogo de modificações externas indevidas.
  • Propriedades Expression-Bodied: A propriedade Informacoes utilizando a sintaxe => deixou o código limpo, moderno e muito elegante.
  • Separação de Responsabilidades: A classe Jogos cuida das propriedades do item e a classe CatalogoJogos gerencia a lista e as regras de exibição.

Para agregar ainda mais valor ao seu projeto e sugerir algumas boas práticas de mercado, deixo aqui duas sugestões de melhorias que você pode aplicar no seu código:

1. Encapsulamento da Lista

No momento, a sua lista CatalogodeJogos está declarada como public. Isso significa que qualquer parte do programa poderia ignorar o seu método AdicionarJogo e fazer alterações diretas na lista (como usar um cj.CatalogodeJogos.Clear() e apagar tudo).

Uma boa prática é deixar a lista como private dentro da classe e, se alguém de fora precisar ler os jogos, expor apenas uma versão de leitura. Veja como ficaria:

public class CatalogoJogos
{
    // A lista interna fica protegida
    private List<Jogos> _catalogoDeJogos = new List<Jogos>();

    // O método continua sendo o único meio seguro de adicionar itens
    public void AdicionarJogo(Jogos jogo)
    {
        _catalogoDeJogos.Add(jogo);
    }

    public void ExibirCatalogo()
    {
        Console.WriteLine("====== CATÁLOGO DE JOGOS ======\n");
        if (!_catalogoDeJogos.Any())
        {
            Console.WriteLine("Nenhum jogo cadastrado.");
            return;
        }

        foreach (var jogo in _catalogoDeJogos)
        {
            Console.WriteLine(jogo.Informacoes);
        }
    }
}

2. Nomenclatura no Singular

É uma convenção muito forte na comunidade C# (e na Orientação a Objetos em geral) que o nome de uma classe que representa uma entidade única seja escrito no singular. Como cada objeto instanciado representa apenas um jogo, o ideal seria mudar o nome da classe de Jogos para Jogo.

Dessa forma, no seu Program.cs, a leitura ficaria ainda mais natural:

Jogo jogo1 = new Jojo("Among Us", 4, "Fácil");

O seu projeto já está funcionando perfeitamente, e essas pequenas mudanças servem apenas para aproximar seu código dos padrões utilizados por grandes equipes de desenvolvimento.

Continue com esse ótimo ritmo de estudos!

Espero que possa ter lhe ajudado!