5
respostas

A aplicação deste Padrão para o Problema é a correta?

Para o problema aprensentado, onde a aplicação cliente já pré selecionou qual formato gostaria de ver, não vejo a necessidade de um mecanismo de decisão como o padrão escolhido. Uma sugestão seria ter uma classe com "de-para" de formato com a classe que resolve o problema, e não passar uma por uma na cadeia para validar se aquela corresponde.

segue um exemplo:

<?php


class MapeamentoFormatador
{
    private $dePara = array(
        "1" => "XML",
        "2" => "CSV",
        "3" => "PORCENTO"
    );

    public function get($formato)
    {
        if (isset($this->dePara[$formato])) {
            return new $this->dePara[$formato]();
        }
        throw new Exception("Formatador Inexistente", 1);
    }
}

class Conta
{
    private $nome;
    private $saldo;

    public function __construct($nome, $saldo)
    {
        $this->nome = $nome;
        $this->saldo = $saldo;
    }

    public function getNome()
    {
        return $this->nome;
    }

    public function getSaldo()
    {
        return $this->saldo;
    }    
}

interface Formatador
{
    public function getDadosFormatados(Conta $conta);
}

class XML implements Formatador
{
    public function getDadosFormatados(Conta $conta) 
    {
        return "<conta><titular>". $conta->getNome() ."</titular><saldo>". $conta->getSaldo() ."</saldo></conta>.";
    }
}

class CSV implements Formatador
{
    public function getDadosFormatados(Conta $conta) 
    {
        return $conta->getNome() .";". $conta->getSaldo();
    }
}

class PORCENTO implements Formatador
{
    public function getDadosFormatados(Conta $conta) 
    {
        return $conta->getNome() ."%". $conta->getSaldo();
    }
}

$MapeamentoFormatador = new MapeamentoFormatador();
$formator = $MapeamentoFormatador->get(3);

echo $formator->getDadosFormatados(
    new Conta("Alura", 500)
);
5 respostas

Oi Diney, tudo bem? Bom, apesar de resolver o problema, eu vejo dois problemas na sua solução que não acontecem usando o padrão de projeto escolhido.

Primeiro, como você cria uma listagem estática de possibilidades, você precisa verificar se o formato existe, podendo trazer problemas no crescimento dessa listagem. Outro ponto seria, caso eu queira fazer uma composição desses formatos pré-existentes (que pode acontecer nos descontos por exemplo) sua solução teria outro problema e mais verificações teriam que ser feita.

Em alguns casos (e eu até poderia dizer que em 'em sua grande maioria') um formato padrão é retornado (um exemplo são os clientes web, que podem solicitar um json ou html e caso não seja suportado o json, o html e retornado mesmo assim) e no seu caso, você lança um erro (que em alguns casos poderia travar toda a aplicação dependendo do tipo de erro lançado).

Entende? Espero ter ajudado! Bons estudos

Tudo bem e contigo ?

Entendo perfeitamente. Em relação de não ter um formato default e lançar uma exception, foi mais pra exemplificar mesmo.

O ponto que eu queria chegar era que como o cliente ja informa qual formato ele quer, acho que poderiamos criar um mecanismo que instância a estratégia diretamente (apenas um processo), não havendo necessidade de passar por uma cadeia de estratégias (mais processamentos) para saber qual atende a ela. O código acima foi uma forma de tentar exemplificar este ponto, claro que ele pode ser melhorado muito também.

Obrigado pela resposta :D

Sim sim, compreendo. Sua solução também é boa, mas tipo, a implementação depende muito da linguagem e das boas práticas da cada uma. A legibilidade de código também é um fator decisivo.

No PHP é possível fazer o que você fez, mas já no Java não. E no Ruby? Acredito que não.

Outra observação é: Nem sempre o processo correrá toda a cadeia e pode haver casos em que seja preciso. Sua solução é direta, mas perde um pouco em legibilidade e clareza.

Outra questão que possa surgir é: Performance! A sua provavelmente seria mais rápida, já que é mais direta, mas seria um ganho de performance irrelevante em tempo computacional, há não ser que o processo em cadeia seja muito complexo.

Contudo, o padrão é um conceito, uma ideia, as implementações podem ser diferentes e não existe um julgamento de certo ou errado. Existe contexto e a melhor solução para ele, isso dentre todas as soluções possiveis.

Eu tenho um codigo parecido, ele tem 3 opcoes, cada opcao eh representado por um objeto, qual seria a melhor maneira de pedir esta instancia?

Oi Diney, lembra de marcar o tópico como resolvido caso tenha resolvido seu problema.

Pedro, acho que 3 opções um if simples não seria problemático, porém quando essas opções passam para 4, 5, 6 o melhor caminho talvez seja aplica um padrão como o Chain of Responsability ou outro...