2
respostas

Aula 1

Pessoal vi em outro tópico uma dúvida sobre a perda de responsabilidade no código que as alterações causaram. Pois no primeiro momento o programador conseguia ver que para um desenvolvedor se aplicava a regra "DezOuVinte", após as alterações o programador é quem deverá "saber" e passar a regra a ser usada...

Eu fiz algumas alterações com base em outro tópico e gostaria de opiniões...

Eu criei a interface IRegraDeCalculo como mencionado na aula e as regras.

        public interface IRegraCalculo
        {
            double Calcula(Funcionario funcionario);
        }

    class DezOuVinte : IRegraCalculo
    {
        public double Calcula(Funcionario funcionario)
        {
            if (funcionario.SalarioBase > 3000.0)
            {
                return funcionario.SalarioBase * 0.8;
            }
            else
            {
                return funcionario.SalarioBase * 0.9;
            }
        }
    }

Porém transformei a classe abstrata Cargo em uma interface ICargo que implementa o metodo RegraCalculo

    public interface ICargo
    {
        IRegraCalculo RegraCalculo();
    }

    class Desenvolvedor : ICargo
    {
        public IRegraCalculo RegraCalculo()
        {
            return new DezOuVinte();
        }
    }

A classe funcionário agora deve receber uma um "ICargo" e a classe calculadora...

    public class Funcionario
    {
        public ICargo Cargo { get; private set; }

        public double SalarioBase { get; private set; }

        public Funcionario(ICargo cargo, double salarioBase)
        {
            this.Cargo = cargo;
            this.SalarioBase = salarioBase;
        }
    }

    public class CalculadoraDeSalario
    {
        public double Calcula(Funcionario funcionario)
        {
            return funcionario.Cargo.RegraCalculo().Calcula(funcionario);
        }
    }

Uma coisa que fiquei na dúvida, é uma boa prática eu criar uma interface que implemente um método que tenha como retorno uma outra interface?

Marcelo

2 respostas

Olá Marcelo, tudo certo?

Pelo que testei, você pode colocar na declaração do método para retornar uma interface:

public IClasse teste(int n) // isso ainda é possível
{
    return new IClasse(n); // não pode instanciar uma interface
}

Na hora de retornar uma IClasse() precisa ser alguém que implemente essa interface. Mas no fim das contas sempre será necessário retornar uma classe concreta.

public IClasse teste(int n)
{
    IClasse classe = new Classe(n);
    return classe; // ainda assim recebe um objeto de uma classe concreta.
}

Espero ter ajudado, caso contrário, tentaremos ajudar novamente.

Bons estudos!

Um adendo.

Você pode ter um método que faça várias verificações e cada verificação retorne uma classe diferente que implemente a interface em questão.

Não achei algo falando sobre boa ou má prática. Mas isso me pareceu bem interessante para resolver esse problema.