1
resposta

[Projeto] Faça como eu fiz: encapsulando reajuste de salário

class Funcionario
{
    private decimal salario;

    public Funcionario(string nome, decimal salario)
    {
        this.salario = salario;
        Nome = nome;
    }

    public string Nome { get; private set; }
    public decimal Salario => salario;

    public void ReajustarSalario(decimal novoValor)
    {
        if(salario > novoValor)
        {
            Console.WriteLine("Erro: O novo salário deve ser maior que o atual.");
        }
        else
        {
            salario = novoValor;
            Console.WriteLine($"Funcionario: {Nome}");
            Console.WriteLine($"Salário atual: {Salario:C}");
        }
    }
}

Funcionario f = new Funcionario("Fernanda Lima", 4000);
f.ReajustarSalario(3500); // Inválido
f.ReajustarSalario(4200); // Válido
1 resposta

Olá, Eduardo. Como vai?

Parabéns pela implementação! Você captou com precisão a essência do Encapsulamento. Mais do que apenas "esconder" dados, essa prática serve para proteger a integridade do objeto, garantindo que ele nunca entre em um estado inválido — como, por exemplo, ter um salário reduzido contra as regras de negócio.

Gostaria de destacar alguns pontos técnicos muito bem executados no seu código:

  • Validação de Regra de Negócio: Ao colocar o if(salario > novoValor) dentro do método ReajustarSalario, você transformou a classe em uma "guardiã" da informação. O mundo externo não consegue mais alterar o salário de forma direta e incorreta.
  • **Uso de decimal**: Excelente escolha! Para valores monetários, o tipo decimal é muito mais indicado que double ou float em C#, pois evita aqueles erros de arredondamento que comentamos em outros tópicos.
  • Expression-bodied Member: O uso de public decimal Salario => salario; para expor o valor apenas como leitura é uma sintaxe moderna e elegante do C#.

Para deixar seu código ainda mais alinhado com as boas práticas de desenvolvimento (especialmente em sistemas maiores), aqui vão duas pequenas sugestões:

  1. Lançamento de Exceções: Em vez de apenas usar um Console.WriteLine para o erro, em aplicações reais costumamos usar throw new ArgumentException(...). Isso interrompe a execução e avisa o restante do sistema que algo deu errado, em vez de apenas imprimir uma mensagem que pode passar despercebida.
  2. Formatação de Moeda: Você usou corretamente o :C no WriteLine, o que é ótimo para a exibição!

Seu progresso na Orientação a Objetos está muito sólido. Continue praticando essa mentalidade de "o que a minha classe deve proteger?".

Espero que possa ter lhe ajudado!