1
resposta

[Projeto] Faça como eu fiz: sistema de reservas em hotel

class Hospede
{
    public Hospede(string nome)
    {
        Nome = nome;
    }

    public string Nome { get; private set; }
}


class Quarto
{
    private decimal valorDiaria;
    public Quarto(int numero)
    {
        Numero = numero;
    }

    public int Numero { get; private set; }
    public decimal ValorDiaria 
    {   get => valorDiaria; 
        set {
            if( value < 1)
            {
                Console.WriteLine("Erro: O minimo do valor da diária é 1");
            }
            else
            {
                valorDiaria = value;
            }
        }  
    }
}

class Reserva
{
    private int diarias;

    public Reserva(Hospede hospede, Quarto quarto, int diarias)
    {
        if(diarias < 1)
        {
            Console.WriteLine("Erro: O minimo de diárias é 1");
        }
        else
        {
            this.diarias = diarias;
            Hospede = hospede;
            Quarto = quarto;
            ExibirReseva();
        }
    }

    public Hospede Hospede { get; }
    public Quarto Quarto { get; }

    public decimal ValorTotal => diarias * Quarto.ValorDiaria;

    public void ExibirReseva()
    {
        Console.WriteLine($"Reserva para: {Hospede.Nome}");
        Console.WriteLine($"Quarto: {Quarto.Numero}");
        Console.WriteLine($"Valor total: {ValorTotal:C}");
    }
}

Hospede hospede = new Hospede("Juliana Moura");
Quarto quarto = new Quarto(101);
quarto.ValorDiaria = 250;

Reserva reserva = new Reserva(hospede, quarto, 3);
1 resposta

Olá, Eduardo. Como vai?

Parabéns por mais essa excelente entrega! Seu sistema de reservas de hotel é um exemplo perfeito de como a Orientação a Objetos organiza a comunicação entre diferentes entidades (Hospede, Quarto e Reserva) de forma harmoniosa e protegida.

Gostaria de destacar os pontos técnicos que tornam seu código muito sólido:

  • Validação em Setters: Você aplicou o encapsulamento clássico na propriedade ValorDiaria. Ao usar o set com uma condicional, você garante que o sistema nunca aceite valores irreais (como diárias negativas), protegendo a integridade financeira do seu modelo.
  • Composição de Objetos: A classe Reserva é o que chamamos de uma classe de associação. Ela "conhece" um Hospede e um Quarto. Essa é a base de grandes sistemas de software: objetos pequenos e simples que se unem para formar uma funcionalidade complexa.
  • Propriedade Calculada Dinâmica: O uso de public decimal ValorTotal => diarias * Quarto.ValorDiaria; é brilhante. Se o valor da diária do quarto mudar antes do fechamento da conta, o ValorTotal estará sempre atualizado, pois ele não armazena o resultado, ele o calcula sob demanda.

Uma pequena sugestão para Evolução:

No seu construtor de Reserva, você adicionou uma validação para as diárias. Caso o valor seja menor que 1, você exibe um erro, mas o objeto Reserva ainda termina de ser criado (mesmo que com dados incompletos ou "nulos" logicamente).

Em C#, uma prática comum para garantir que um objeto nunca exista se estiver errado é o uso de Exceções:

public Reserva(Hospede hospede, Quarto quarto, int diarias)
{
    if (diarias < 1)
    {
        // Interrompe a criação do objeto se o dado for inválido
        throw new ArgumentException("O mínimo de diárias é 1.");
    }
    this.diarias = diarias;
    Hospede = hospede;
    Quarto = quarto;
}

Isso impede que o programa continue com uma reserva "fantasma" que não tem diárias definidas.

Fora esse detalhe de arquitetura, seu código está impecável e muito bem escrito, seguindo as convenções de nomes do C# (PascalCase). Você está demonstrando que já entende como as peças de um software devem se encaixar com segurança!

Espero que possa ter lhe ajudado!