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

Ex 7 da Aula sobre Chain of Responsability

Ola pessoal

Não sei mas tem hora (quase sempre :) ) que me confunde visto que não uso isso no dia-a-dia..Mas sou teimoso :) e insisto em entender e aprender desenvolvimento. Só para deixar claro quando se fala em setter: na resposta do exercício 7 o Instrutor comenta que : "...Com o setter do Proxima na interface, garantimos que toda implementação saberá lidar com uma próxima resposta..." e a interface está assim:

interface Resposta 
{
    void Responde(Requisicao req, Conta conta);
}

Mas onde está o setter do Proxima na Interface?

No exercício anterior a Interface ficou assim:

interface Resposta 
    { 
        void Responde(Requisicao req, Conta conta); 
        Resposta Proxima { get; set; } 
    }

A diferença de uma para outra está que foi retirado o Resposta Proxima { get; set;}

Agradeço qualquer dica.

2 respostas

Olá Jõao,

Na verdade no texto quando o instrutor falou "Com o setter do Proxima na interface, garantimos que toda implementação saberá lidar com uma próxima resposta" ele estava se referindo justamente a implementação anterior na qual a interface resposta tinha o setter, no caso

interface Resposta 
{ 
        void Responde(Requisicao req, Conta conta); 
        Resposta Proxima { get; set; } 
}

Ele comenta que a grande vantagem desta implementação é que a interface deste jeito força para que todas as classes que a implementam tenham a propriedade Proxima e seu setter. Porém, a desvantagem desta implementação é toda vez que o programador usar uma classe de Resposta, como a RespostaEmXml, ele precisa lembrar que antes de chamar o método Responde ele precisa settar uma Proxima. Mas nada neste código ajuda ou força ele a lembrar de fazer isto.

Um outro jeito de implementar este código é retirar da interface a propriedade Proxima e em cada classe criar um construtor que recebe a Proxima (ou OutraResposta como está na solução), que ficaria assim:

interface Resposta 
{
    void Responde(Requisicao req, Conta conta);
}

class RespostaEmXml : Resposta 
{
    public Resposta OutraReposta { get; private set; }

    public RespostaEmXml(Resposta outraResposta) 
    {
        this.OutraResposta = outraResposta;
    }

    public void Responde(Requisicao req, Conta conta) 
    {
        if(req.Formato == Formato.XML) {
            Console.WriteLine("<conta><titular>" + conta.Titular + "</titular><saldo>" + conta.Saldo + "</saldo></conta>");
        }
        else 
        {
            outraResposta.Responde(req, conta);
        }
    }
}

A vantagem desta solução é que o construtor agora força na hora que o programador vai instanciar a RespostaEmXml ele já tem que fornecer a próxima. Ou seja, ele não precisa ficar lembrando de chamar um setter. No entanto, a desvantagem desta solução é que como a interface perdeu a propriedade e o setter, as classes que implementa Resposta agora não são forçadas a ter uma proxima resposta. Cabe ao programador lembrar de colocar esta informação nestas classes.

Então o grande barato deste exercício e que o instrutor quis passar é que você tem várias formas de resolver este problema, cada uma das soluções tem suas vantagens e desvantagens.

solução!

Valeu Lucas.. entendi perfeitamente. Excelente explicação. Obrigado.