1
resposta

[Projeto] Faça como eu fiz: montagem de computadores

Resolução:
Processador.cs

namespace PraticandoC_05.MontagemDeComputadores07
{
    internal class Processador
    {
        public Processador(string marca, string modelo)
        {
            Marca = marca;
            Modelo = modelo;
        }

        public string Marca { get; }
        public string Modelo { get; }

    }
}

PlacaMae.cs

namespace PraticandoC_05.MontagemDeComputadores07
{
    internal class PlacaMae
    {
        public string Fabricante { get; }
        public string Socket { get; }
        public PlacaMae(string fabricante, string socket)
        {
            Fabricante = fabricante;
            Socket = socket;
        }
    }
}

Computador.cs

namespace PraticandoC_05.MontagemDeComputadores07
{
    internal class Computador
    {
        public Computador(Processador processador, PlacaMae placaMae)
        {
            Processador = processador;
            PlacaMae = placaMae;
        }

        public Processador Processador { get; }
        public PlacaMae PlacaMae { get; }

        public void ExibirConfiguracao()
        {
            Console.WriteLine("\nComputador configurado com:");
            Console.WriteLine($"Processador: {Processador.Marca} - {Processador.Modelo}\n" +
                $"Placa-mãe: {PlacaMae.Fabricante} - {PlacaMae.Socket}\n");
        }
    }
}

Program.cs

Processador cpu = new("Intel", "Intel Core i5-13400");
PlacaMae mobo = new PlacaMae("ASUS", "LGA");
Computador pc = new (cpu, mobo);

pc.ExibirConfiguracao();
1 resposta

Olá, Christopher. Como vai?

Parabéns por concluir mais um desafio com maestria! O seu código para o sistema de montagem de computadores está absolutamente correto e reflete uma das decisões de design mais importantes no desenvolvimento de software.

O grande brilho da sua resolução está no fato de você ter compreendido perfeitamente o conceito de Composição em vez de herança para esse cenário.

Herança vs. Composição

Muitos desenvolvedores iniciantes cometem o erro de fazer a classe Computador herdar de Processador ou de PlacaMae. No entanto, no mundo real e na modelagem de sistemas, a relação de herança é um vínculo do tipo "É um" (ex: um Docente é uma Profissão).

No caso da montagem de uma máquina, a relação correta é de composição, que representa um vínculo do tipo "Tem um" ou "É composto por": um Computador não é um processador, ele tem um processador e tem uma placa-mãe.

Ao passar as instâncias de Processador e PlacaMae como argumentos no construtor do Computador, você aplicou de forma impecável a injeção dessas dependências, mantendo as classes desacopladas e fáceis de dar manutenção.

Uma Sugestão de Boas Práticas: Encapsulamento Avançado

O seu código já está ótimo, mas como uma sugestão de evolução para o ecossistema do seu projeto, repare que as propriedades da classe Computador foram declaradas com um nível de acesso público total para leitura:

public Processador Processador { get; }
public PlacaMae PlacaMae { get; }

No design de componentes, se o mundo externo (como o seu Program.cs) só precisa mandar o computador exibir a sua própria configuração e não necessita acessar o processador diretamente, nós podemos esconder esses componentes internos utilizando o modificador private readonly.

Veja como a classe Computador ganharia um nível extra de blindagem e encapsulamento:

namespace PraticandoC_05.MontagemDeComputadores07
{
    internal class Computador
    {
        // Campos privados e somente leitura para proteger os componentes internos
        private readonly Processador _processador;
        private readonly PlacaMae _placaMae;

        public Computador(Processador processador, PlacaMae placaMae)
        {
            _processador = processador;
            _placaMae = placaMae;
        }

        public void ExibirConfiguracao()
        {
            Console.WriteLine("\nComputador configurado com:");
            Console.WriteLine($"Processador: {_processador.Marca} - {_processador.Modelo}");
            Console.WriteLine($"Placa-mãe: {_placaMae.Fabricante} - {_placaMae.Socket}\n");
        }
    }
}

Por que essa mudança é interessante?

Ao adotar essa convenção (usando o sublinhado _ para identificar campos privados), você garante que nenhuma outra parte do software consiga mexer ou tentar ler as peças do computador por fora da classe, concentrando toda a responsabilidade de exibição dentro do método ExibirConfiguracao().

Excelente trabalho com a sintaxe moderna do C# (como a inicialização simplificada new(...) no Program.cs). Continue firme nessa sequência de exercícios!

Espero que possa ter lhe ajudado!