Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida Exercício 7 | Aula 2

Pessoal,

Em relação ao exercício supracitado, não ficou claro a implementação da classe que tem a responsabilidade de encadear a corrente de chamadas do padrão chain fo responsibility, quando se trata da passagem de referencia é pelo construtor, acredito que última classe deverá receber um construtor vazio ?

3 respostas

Oi SuperUser, tudo bem?

Em relação ao exercício supracitado, não ficou claro a implementação da classe que tem a responsabilidade de encadear a corrente de chamadas do padrão chain fo responsibility

Você está falando sobre a classe CalculadorDeDescontos, certo?

quando se trata da passagem de referencia é pelo construtor, acredito que última classe deverá receber um construtor vazio ?

Você está falando deste exercício aqui?

Fim da corrente no Chain of Responsibility

Como você faria para lidar com o fim da corrente, sem precisar criar uma classe que não faça nada igual fizemos no vídeo e no primeiro exercício? Cole sua implementação aqui.

Se for isso, para lidar com o fim da corrente, basta não apontar o "próximo" do objeto da última classe se requisição. Então nenhuma outra requisição será executada e a cadeia chegará ao seu fim.

Marcelo, estou falando do exercício "Fim da corrente no Chain of Responsibility", que no exemplo na atividade não tem a implementação da que fica responsável pela cadeia...

Efetuei o seguinte código...

namespace CursoDesignPatterns
{
    public class RealizaChamadaRequisicao
    {
        public void Chamada(Requisicao requisicao, Conta conta)
        {
            var r1 = new XML(new PontoEVirgula(new Porcento()));
            r1.Responde(requisicao, conta);
        }
    }

public class XML : IResposta
    {
        public IResposta OutraResposta { get; set; }


        public XML(IResposta outraResposta)
        {
            OutraResposta = outraResposta ?? throw new ArgumentNullException(nameof(outraResposta));
        }

        public void Responde(Requisicao requisicao, Conta conta)
        {
            if (requisicao.Formato == Formato.XML)
            {
                Console.WriteLine($"<conta><titular>{conta.Nome}</titular><saldo>{conta.Saldo}</saldo></conta>");
            }
            else
            {
                OutraResposta.Responde(requisicao, conta);
            }
        }
    }
public class PontoEVirgula : IResposta
    {
        public IResposta OutraResposta { get; set ; }



        public PontoEVirgula(IResposta outraResposta)
        {
            OutraResposta = outraResposta ?? throw new ArgumentNullException(nameof(outraResposta));
        }

        public void Responde(Requisicao requisicao, Conta conta)
        {
            if (requisicao.Formato == Formato.CSV)
            {
                Console.WriteLine($"{conta.Nome};{conta.Saldo}");
            }
            else
            {
                OutraResposta.Responde(requisicao, conta);
            }
        }
    }

public class Porcento : IResposta
    {
        public IResposta OutraResposta { get; set ; }

        public Porcento()
        {
        }

        public Porcento(IResposta outraResposta)
        {
            OutraResposta = outraResposta ?? throw new ArgumentNullException(nameof(outraResposta));
        }

        public void Responde(Requisicao requisicao, Conta conta)
        {
            if (requisicao.Formato == Formato.PORCENTO)
            {
                Console.WriteLine($"{conta.Nome}%{conta.Saldo}");
            }
            else if (OutraResposta == null)
            {
                OutraResposta.Responde(requisicao, conta);
            }
            else
            {
                throw new ArgumentException("Formato de resposta não encontrada");
            }
        }
    }

public interface IResposta
    {
        void Responde(Requisicao requisicao, Conta conta);
        IResposta OutraResposta { get; set; }
    }
}

A minha questão é a seguinte: em relação a criação da classe [RealizaChamadaRequisicao] está correta? e sobre a classe PontoEVirgula ficou a dúvida no construtor... foi não tenho um objeto para passar e nesse caso criei um construtor padrão está certo ?

solução!

Pelo código que você passou, você poderia testar com uma classe como a seguinte (porém, não testei)

public class Program
{
    static void Main(String[] args) 
    {
        RealizaChamadaRequisicao gerenciadorChamadas = new RealizaChamadaRequisicao();

        Requisicao requisicao = new Requisicao();
        Conta conta = new Conta("José da Silva", 150.00);

        gerenciadorChamadas.Chamada(requisicao, conta);
    }
}

Sobre a classe Porcento, que é o último elo da cadeia, você criou um construtor vazio, o que é o correto, pois não há um próximo objeto na cadeia para processar.

Porém, este trecho está incorreto:

            else if (OutraResposta == null)
            {
                OutraResposta.Responde(requisicao, conta);
            }

Se OutraResposta é nulo, você não pode chamar o método Responde. Deveria ser: else if (OutraResposta != null).