Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Como testar o chain of responsibility para a formatação da exibição dos dados de conta?

Olhando as dúvidas que já tinham no fórum, encontrei essa: https://cursos.alura.com.br/forum/topico-duvida-como-rodar-o-program-cs-50455

Porém ao meu ver você não esta usando chain of responsibility se você instância RespostaEmCSV e RespostaEmXML. Se for criado no Program.cs o que o colega sugeriu, nunca o código irá cair nos "else OutraResposta.Responde(req, conta);", pois você esta chamando diretamente o método Responde no formato que você deseja.

Por isso, eu implementei de outra forma o Program.cs

Conta conta = new Conta("Jaqueline", 2000);
Formatador formatador = new Formatador();

formatador.Formata(new Requisicao(Formato.CSV), conta);
formatador.Formata(new Requisicao(Formato.XML), conta);
formatador.Formata(new Requisicao(Formato.PORCENTO), conta);

Eu criei outra classe chamada Formatador que recebe uma Requisição e um Conta.

public class Formatador
{
        public void Formata(Requisicao requisicao, Conta conta)
        {
            IResposta f1 = new RespostaXml();
            IResposta f2 = new RespostaCsv();
            IResposta f3 = new RespostaPorcento();

            f1.OutraResposta = f2;
            f2.OutraResposta = f3;

            f1.Responde(requisicao, conta);
        }
}

A classe Fomatador é quem uni a corrente, assim como a classe CalculadorDeDescontos mostrada na videoaula.

Porém, analisando o código eu não vejo a utilidade da classe Requisicao que foi sugerida a ser criada. Eu poderia passar diretamente o enum para o metodo Formata da classe Formator.

formatador.Formata(Formato.CSV, conta);

E modificar os tipo de classe resposta para, por exemplo:

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

        public void Responde(Formato formato, Conta conta)
        {
            if (formato == Formato.CSV)
                Console.WriteLine(conta.Titular + ";" + conta.Saldo);
            else
                OutraResposta.Responde(req, conta);
        }
}

Faz sentido?

Acho que não esta muito claro pra mim o que era pra ser desenvolvido. Alguém poderia me ajudar em entender como deveria ser feito o Program.cs e como o Padrão Chain of Responsibility esta sendo utilizado?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software