1
resposta

No chain of responsability um objeto chamar um outro não quebra o princípio SRP?

Me parece estranho que, um objeto além de aplicar desconto, tem que saber também que, ele faz parte de uma corrente, e que ele tem a referência de um objeto, que deve ser chamado caso ele não resolva a questão.

Solucionar o problema da seguinte forma, parece-me, que deixa o código mais simples e fácil de ler, além de que me parece não ferir os princípios SRP e Open Closed:

// Suponha que exista uma interface IDesconto com os seguintes membros:
// void Calcular()
// bool DescontoFoiCalculado
// double ValorCalculado

public double AplicarDesconto(double valor)
{
    var listaDePossiveisDescontos = new List<IDesconto> {
        new PrimeiroDesconto(),
        new SegundoDesconto(),
        new TerceiroDesconto()
    }

    foreach (var desconto in descontos)
    {
        desconto.Calcular();
        if (desconto.DescontoFoiCalculado)
            return desconto.ValorCalculado;
    }
}

Cada classe de desconto passa a fazer uma única coisa que é calcular o desconto, se for devido. E para adicionar um novo desconto basta adicioná-lo à lista.

1 resposta

Olá Junio!

Realmente, no padrão Chain of Responsibility, pode parecer que um objeto está fazendo mais do que deveria, pois além de aplicar o desconto, ele também precisa saber que faz parte de uma corrente e que pode chamar outro objeto caso não resolva a questão.

No entanto, é importante lembrar que o objetivo desse padrão é justamente evitar o acoplamento entre os objetos, permitindo que cada um deles possa tratar uma requisição de forma independente. Dessa forma, o objeto que está aplicando o desconto não precisa saber qual é o próximo objeto da corrente, ele apenas precisa saber se conseguiu resolver a questão ou não.

A solução que você propôs utilizando uma lista de possíveis descontos também é uma boa alternativa, pois permite adicionar novos descontos de forma mais simples e fácil de ler. Além disso, cada classe de desconto fica responsável apenas por calcular o desconto, o que respeita o princípio SRP.

Porém, é importante lembrar que essa solução pode não ser adequada em todos os casos, pois pode haver situações em que a corrente de objetos precisa ser dinamicamente modificada em tempo de execução. Nesses casos, o padrão Chain of Responsibility pode ser mais adequado.

Espero ter ajudado e bons estudos!