1
resposta

Dúvida sobre tipo de retorno e não com propriedade Próximo.

Poderia retornar o próximo tipo ao invés de fazer essa ligação no desconto? E na classe CalculadorDeDesconto teria um while por exemplo, enquanto próximo tipo for diferente de null tenta aplicar o desconto.

Algo do tipo

public class Orcamento
    {
        public double Valor { get; private set; }
        public double ValorDesconto { get; private set; }
        public IList<Item> Itens { get; private set; }

        public Orcamento(double valor)
        {
            this.Valor = valor;
            this.Itens = new List<Item>();
        }

        public void AdicionaItem(Item item)
        {
            Itens.Add(item);
        }

        public void AplicaDesconto(double valor)
        {
            this.ValorDesconto = valor;
            this.Valor = Valor - ValorDesconto;
        }
    }
public interface IDesconto
    {
        IDesconto Desconta(Orcamento orcamento);
    }
public class DescontoPorCincoItens : IDesconto
    {
        public IDesconto Desconta(Orcamento orcamento)
        {
        if (orcamento.Itens.Count > 5)
                orcamento.AplicarDesconto(orcamento.Valor * 0.1);

            return typeof(DescontoPorMaisDeQuinhentosReais);
        }
    }
public class DescontoPorMaisDeQuinhentosReais : IDesconto
    {
        public IDesconto Desconta(Orcamento orcamento)
        {
            if (orcamento.Valor > 500.0)
             orcamento.AplicarDesconto(orcamento.Valor * 0.1);

            return null;
        }
    }
public class CalculadorDeDesconto
    {
        public double Calcula(Orcamento orcamento)
        {
            IDesconto proximo = new DescontoPorCincoItens().Desconta(orcamento);

            while (proximo != null)
            {
                var desconto = // Buscar classe da injeção de dependencia
                proximo = desconto.Desconta(orcamento);
            }
        }
    }
1 resposta

Oi Bruno, eu não vejo problema em fazer dessa forma.. vc não seguiria o pattern a ferro e fogo, mas continua elegante. O retorno nulo é um pouco estranho, já que se o método tem um retorno é esperado que ele retorne de fato.. mas é apenas um detalhe.