1
resposta

Como saber qual classe instanciar

Olá

Fiz os cursos de Solid, OO, arquitetura PHP e fiquei com uma dúvida.

Supondo uma situação em que tenho uma "interface web" onde um cliente faz um pedido e chega o momento do pagamento. Meu site aceita várias formas de pagamento:

Paypal, cartão de crédito, Pix, Boleto....

O cliente escolhe a forma de pagamento desejada e esta escolha é enviada para minha aplicação efetivar o pagamento junto a plataforma escolhida.

Supondo que o cliente escolheu a opção PIX, e que na minha camada que vai instanciar a classe de pagamento chega a opção '3' ( opção que corresponde ao pagamento por PIX )

Cada uma das opções da "interface web" tem um classe que implementa suas particularidades de pagamento. Elas implementam uma interface(classe) que tem um método "EfetuaPagamento".

Eu teria que instanciar a Classe "PagamentoViaPix", pois corresponde à forma de pagamento escolhida pelo cliente.

Minha dúvida é como faço associação entre a informação "3-PIX" e a classe que deve ser instanciada?

Através de IFs, testando os valores que podem ser recebidos da web?

Att.

Evandro

1 resposta

Olá Evandro! Tudo bem com você?

Peço desculpa pela demora para responder o seu tópico.

Ótima pergunta! Quando temos diferentes opções de pagamento e cada uma delas é representada por uma classe específica, é comum utilizar uma estratégia de associação entre a informação recebida e a classe que deve ser instanciada.

Uma abordagem comum é utilizar um padrão de projeto chamado "Factory Method" (Método de Fábrica). Nesse padrão, você pode criar uma classe chamada "PagamentoFactory" que será responsável por instanciar a classe correta conforme a opção de pagamento recebida.

Dessa forma, você não precisa utilizar vários IFs para testar os valores recebidos da web. A classe "PagamentoFactory" será responsável por fazer essa associação de forma mais elegante e flexível.

Aqui está um exemplo de como você poderia implementar a classe "PagamentoFactory":

class PagamentoFactory {
    public static function criarPagamento($opcao) {
        switch ($opcao) {
            case '1':
                return new PagamentoViaPaypal();
            case '2':
                return new PagamentoViaCartaoCredito();
            case '3':
                return new PagamentoViaPix();
            case '4':
                return new PagamentoViaBoleto();
            default:
                throw new Exception('Opção de pagamento inválida');
        }
    }
}

Dessa forma, você pode simplesmente chamar o método criarPagamento da classe PagamentoFactory, passando a opção de pagamento recebida da web, e ele retornará a instância correta da classe de pagamento correspondente.

$opcaoPagamento = $_POST['opcao_pagamento'];
$pagamento = PagamentoFactory::criarPagamento($opcaoPagamento);
$pagamento->efetuaPagamento();

Espero que isso te ajude a resolver o problema! Se tiver mais alguma dúvida, estarei à disposição.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.