1
resposta

É possível NÃO usar mesmo switch/ifs quando se aplica o Strategy?

(se for uma pergunta duplicada, me desculpem)

Veja o caso aplicado no curso:

Temos dentro da classe Imposto, o switch com as opções de ICMS e ISS, porém, ao usar o strategy, pode ser removido isso e tudo ficam em classes separadas. Perfeito.

Mas na chamada final, lá no arquivo de teste, quando quiser usar tanto o ICMS quanto o ISS, vai precisar ser criado um switch para saber quando chamar a classe correta.

Eu entendi que a ideia do strategy é separar as responsabilidades e tentar centralizar esse switch em um ponto, mas, tem como fazer tudo isso SEM usar nenhum tipo de IF lá na chamada final?

Minha dúvida vem do seguinte motivo: eu tenho um switch na minha aplicação e dentro do switch, eu chamo métodos da minha classe e agora ao aplicar o Strategy, ao invés de chamar métodos, irei chamar classes diferentes. Não muda muito. Talvez meu caso não seja para uso do Strategy?

1 resposta

Olá Andrei, tudo bem?

Entendo sua preocupação e é uma questão muito relevante. O padrão Strategy realmente tem como objetivo principal separar as responsabilidades e centralizar a lógica de decisão em um único lugar. No entanto, isso não necessariamente significa que você será capaz de evitar completamente o uso de estruturas condicionais como switch/if.

No caso que você mencionou, onde você tem um switch que decide qual método de uma classe chamar, o padrão Strategy pode ajudar a simplificar essa lógica, mas pode não ser capaz de eliminá-la completamente.

Por exemplo, em vez de ter um switch que decide qual método chamar, você pode ter um switch que decide qual estratégia usar. Isso ainda requer um switch, mas a lógica de decisão é muito mais simples e a responsabilidade de cada operação é separada em sua própria classe.

Aqui está um exemplo simplificado:

switch ($tipoImposto) {
    case 'ICMS':
        $imposto = new ICMS();
        break;
    case 'ISS':
        $imposto = new ISS();
        break;
    default:
        throw new Exception("Tipo de imposto desconhecido: $tipoImposto");
}

$total = $imposto->calcula($valor);

Nesse exemplo, ainda temos um switch, mas ele está apenas decidindo qual estratégia usar. A lógica real para calcular o imposto está contida nas classes ICMS e ISS.

Então, para responder à sua pergunta, o padrão Strategy pode ajudar a simplificar sua lógica e separar as responsabilidades, mas pode não ser capaz de eliminar completamente a necessidade de estruturas condicionais.

Espero ter ajudado e bons estudos!