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

Como aplicar o Strategy no caso de termos um ID como referência?

Boa tarde! Qual seria a melhor forma de aplicar o design pattern Strategy sendo que, por exemplo, teremos um cargo_id vindo da base de dados que representará o Cargo de um funcionário (por exemplo).

Pelo o que pesquisei aqui, a moçada usa um Factory para criar a instância de cada cargo, algo do tipo:

class CargoFactory
{
    public static function create(int $cargoId)
    {
        switch($cargoId) {
            case 1 :
                return new Diretor;
            case 2 :
                return new Supervisor;
            case 3 :
                return new Coordenador;
            case 4 :
                return new Funcionario;
            default :
                throw new RuntimeException('Não foi possível criar a instância do funcionário utilizando o cargoId ' . $cargoId);
        }
    }
}

Tranquilo, aqui funciona deboa! Mas ainda sim, não estamos com if's (nesse caso switch/case? Toda vez que for criado um cargo terei que vir aqui e adicionar mais um case.

Existe uma forma melhor para fazer isso?

4 respostas
solução!

Tendo só o ID do cargo, esse é o modo mais apropriado. Se você tivesse o nome da classe que quer instanciar, poderia fazer a reflexão:

public static function create(string $cargoClassName) {
  $class = "Class".$cargoClassName;
  return new $class();
}

Outra opção é criar um mapa id->classe, mas assim ainda teria que adicionar na lista. Só removeria os IFs.

Eu estava refletindo sobre isso e então cheguei a seguinte conclusão:

são duas situações diferentes, uma é a questão de você fabricar um objeto pelo id/string (Factory) e outra é você abstrair a questão do calculo de comissão de forma estratégica (Strategy).

Então, creio que na parte da criação da Classe concreta (como eu e você mostramos) não tem pra onde fugir: toda vez que for adicionado um novo cargo, tem que ir no factory a escrever, a não ser que a gente guarde o nome da Classe como você colocou né?

Irei estudar essas possiblidades!

Boa realmente é isso mesmo. Sugiro marcar a resposta que mais estabelece a resolução do tópico como solução, mesmo que seja a sua, para que outros alunos com a mesma dúvida saibam que a questão foi resolvida!

Bons estudos!

Claro! Tinha me esquecido!

Muito obrigado!