2
respostas

Desafio | Um contrato para bonificação

Olá pessoas lindas,

Partiu último desafio...

Pra resolver esse problema primeiramente vamos para abstração.

  • Sabemos que todos os funcionários devem ter bonificação.
  • E cada tipo de funcionário tem sua própria regra de negócio.

[ ] - Construir a interface e organizar o código

[ ] - Aplicar a interface para todos os funcionários

[ ] - Implementar o método Bonificar()

Com isso em mente removemos a prop Bonificacao, ele será transformado em método.

Vamos começar atacando a Interface, nesse atual ponto temos também uma outra interface IAutenticavel, para deixar nosso código mais organizado, criei um diretório chamado interfaces, movi o IAutenticavel, e ajustei suas importações. Criei uma nova interface chamado IBonificacao, ficando assim:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como as regras de negócio da bonificação é diferente para cada tipo de cargo entre os funcionários, então deve ser implementada por quem a utiliza.

IBonificacao.cs

    public interface IBonificacao
    {
        public double Bonificar();
    }

[x] - Construir a interface e organizar o código


Vamos agora disponibilizar a bonificação para todos os funcionários, e para isso na classe Funcionario.cs, fazer o uso da interface IBonificacao.cs

Funcionario.cs

    public abstract class Funcionario : IBonificacao
    {
        public static int TotalDeFuncionarios { get; private set; }
        public string Nome { get; private set; }
        public string Cpf { get; private set; }
        public double Salario { get; protected set; }

        protected Funcionario(string nome, string cpf, double salario)
        {
            this.Nome = nome;
            this.Cpf = cpf;
            this.Salario = salario;
            TotalDeFuncionarios++;
        }

        public abstract void AumentarSalario();

        public void MostrarFuncionario()
        {
            System.Console.WriteLine($"Nome: {this.Nome}");
            System.Console.WriteLine($"CPF: {this.Cpf}");
            System.Console.WriteLine($"Salário: {this.Salario.ToString("C")}");
        }

        public abstract double Bonificar();
    }

Reparem que dessa forma temos que possuir o método Bonificar(), mas não somos obrigado a implementar, pois essa é uma classe abstrata, não faz sentido criar uma lógica ou regra de negócio para algo que nunca sairá do papel.

[x] - Aplicar a interface para todos os funcionários


Agora esta fácil, pois uma vez que qualquer classe herdar de funcionário ela será obrigada a implementar o método Bonificar();

Auxiliar.cs

    public class Auxiliar : Funcionario, IBonificacao
    {
        public Auxiliar(string nome, string cpf) : base(nome, cpf, 2000) { }
        public override void AumentarSalario() => this.Salario *= 1.1;
        public override double Bonificar() => this.Salario *= 1.2;
    }

Designer.cs

    public class Designer : Funcionario
    {
        public Designer(string nome, string cpf) : base(nome, cpf, 3000) { }
        public override void AumentarSalario() => this.Salario *= 1.11;
        public override double Bonificar() => this.Salario *= 1.17;
    }

Diretor.cs

    public class Diretor : FuncionarioAutenticavel
    {
        public Diretor(string nome, string cpf) : base(nome, cpf, 5000) { }
        public override void AumentarSalario() => this.Salario *= 1.15;
        public override double Bonificar() => this.Salario *= 1.5;
    }

GerenteDeContas.cs

    public class GerenteDeContas : FuncionarioAutenticavel
    {
        public GerenteDeContas(string nome, string cpf) : base(nome, cpf, 4000) { }
        public override void AumentarSalario() => this.Salario *= 1.05;
        public override double Bonificar() => this.Salario *= 1.25;
    }

Dessa forma, caso algum dia venha a existir outros cargos dentro da empresa, basta implementar o método da interface IBonificar, e caso alguma norma mude em relação a bonificação, basta alterar apenas o local da mudança, sem afetar outras partes do código que não sofrerão alterações.

[x] - Implementar o método Bonificar()


Obrigado por lerem até aqui. Bons Estudos! e uma ótima semana.
2 respostas

Parabéns Lucas, muito bom!