Bom dia. Queria aqui levantar dois pontos: 1) No exemplo dos orçamentos, tínhamos diversos tipos de descontos e uma classe cliente que processava esses descontos. Essa classe cliente, na minha opinião, ficou muito acoplada com as regras de descontos existentes (ou as novas que poderão surgir), também aparentemente violando o princípio OCP do SOLID, ou seja, a cada nova regra, teria que abrir essa classe para incluir mais uma linha. Teria uma forma de resolver isso? Exemplo:
public class CalculadoraDeDescontos { public void calcula() {
Desconto d1 = new DescontoPorMaisDeCincoItens(); Desconto d2 = new DescontoPorMaisDeQuinhentosReais(); Desconto d3 = new NovoDesconto();
d1.setProximo(d2); d2.setProximo(d3);
return d1.desconta(orcamento); } } ``
2) Uma classe que implementa uma interface mas não fornece nenhum código no corpo me incomoda um pouco. Não seria mais elegante verificar, em cada elemento chain, se o próximo não é nulo e se não for, chamar a execução? Mais ou menos assim:
`` public class DescontoPorMaisDeQuinhentosReais implements Desconto { private Desconto proximo;
public void setProximo(Desconto proximo) { this.proximo = proximo; }
public double desconta(Orcamento orcamento) { if(orcamento.getValor() > 500) { return orcamento.getValor() * 0.07; } else if (proximo !=null) { return proximo.desconta(orcamento); } else { return 0; } } } ``