Acho que tem um detalhe que vc não entendeu: usar if é uma das formas de implementar esses patterns.
Um design pattern só descreve de forma geral (teórica, genérica) o que é pra fazer. Mas como isso será feito fica a cargo de quem for implementar.
Vc pode fazer com if, switch, polimorfismo, ponteiro de função ou seja lá o que for que a linguagem que está usando disponibiliza.
Isso não faz o menor sentido. Design patterns é, e sempre será sobre orientação a objetos. Só porque eu uso if/switch
não significa que estou usando o design pattern.
E daí? E se eu estiver usando uma linguagem que não é orientada a objetos? No link que indiquei, ao final, tem vários links para artigos com implementações dos patterns em C (o exemplo acima foi adaptado deste).
Ele apenas demonstra como "implementar" o pattern em C, não que usar if/switch
é o design pattern. Não é só porque dá para "implementar" em C que significa que seja algo universal.
Se eu usar if/switch, cada alteração nas categorias implica em ter que revisar o código de todas essas funções.
Você está 'otimizando' para um cenário absurdo, em que terá trocentas funções.
Além disso você superestima o esforço gasto pra adicionar uma nova categoria na versão com if/switch
.
Já se usar o segundo código, eu não preciso alterar as funções calcularPreco e maximoParcelas (e nem todas as outras trocentas funções que mencionei).
Mas se precisar adicionar uma função calcularFrete(categoria)
em que cada categoria tem um cálculo de frete diferente, você vai precisar alterar em todas as classes. E no caso do if/switch
, é só adicionar a nova função de frete.