Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Uso de State quando o estado é recebido como String

Tenho um aplicação que recebe o callback de uma API que informa a situação de um pagamento, o sistema deve realizar uma ação para cada estado que o pagamento se encontra, logo pensei em implementar o state nessa parte do sistema.

Ao começar percebi que mesmo que eu utilize o state fazendo a refatoração dos estados possíveis para classes, eu precisaria fazer um switch para analisar qual o retorno da API, já que ela envia o status do pagamento como string no corpo da requisição, isso parece um pouco redundante e não tenho certeza se está certo ou se seria a melhor solução.

Para ilustrar melhor seria algo tipo isso:

switch ($retorno_API){
    case "ESTADO 1":
        $context = new Context(new ConcreteStateA());
        $context->request1();
        break;
    case "ESTADO 2":
        $context = new Context(new ConcreteStateB());
        $context->request1();
        break;
}

Parece redundante já que a intenção do State seria evitar esses switch que cresce infinitamente.

1 resposta
solução!

Você está certo em perceber que usar um switch para lidar com os diferentes estados de pagamento pode se tornar redundante e difícil de manter, especialmente se o número de estados aumentar ao longo do tempo.

O padrão de design State é uma abordagem adequada para lidar com esse tipo de situação, mas pode ser necessário fazer algumas modificações para evitar o uso do switch.

Uma ideia seria mapear os estados da API para classes diretamente, sem a necessidade do switch. exemplo:

    
    // Mapeamento dos estados da API para classes de estado
    $stateMap = [
        "ESTADO 1" => ConcreteStateA::class,
        "ESTADO 2" => ConcreteStateB::class,
        // Outros estados...
    ];

    // Verifica se o estado está mapeado e cria a instância apropriada
    if (isset($stateMap[$retorno_API])) {
        $stateClass = $stateMap[$retorno_API];
        $context = new Context(new $stateClass());
        $context->request1();
    } else {
        // Estado não mapeado, trata como necessário
        // ...
    }
    

Criando um mapa que associa cada estado retornado pela API a uma classe correspondente de estado.

Depois, verificamos se o estado retornado está presente no mapa. Se ele estiver, instanciamos a classe apropriada e realizamos a ação necessária.

Se não, podemos tratar o estado não mapeado de acordo com as necessidades do sistema.

Dessa forma, da pra evitar o uso do switch para lidar com cada estado individualmente e aproveita os benefícios do padrão de design State, tornando o código mais flexível e de fácil manutenção à medida que novos estados são adicionados.