Prezados, fiz uma implementação diferente para os descontos e gostaria da opinião de vocês pra saber se estou mantendo boas práticas. Percebi que todas as classes de descontos incluíam o atributo "Desconto proximo;" e o método "setProximo" era sempre o mesmo.
Pensando nisso, criei uma outra classe "DescontoPai" e a tornei abstrata, implementando a interface Desconto e incluindo o atributo "proximo" como protected, além do método "setProximo". Deixei o método "calcula" como abstrato:
public abstract class DescontoPai implements Desconto {
protected Desconto proximo;
@Override
public abstract double calculaDesconto(Orcamento orcamento);
@Override
public void setProximo(Desconto desconto) {
proximo = desconto;
}
}
Com isso, nas classes filhas apenas herdei de DescontoPai e implementei os respectivos algoritmos. Segue uma das classes:
public class DescontoVendaCasada extends DescontoPai {
@Override
public double calculaDesconto(Orcamento orcamento) {
if (orcamento.existe("Lapis") && orcamento.existe("Caneta")) {
System.out.println("Desconto de venda casada - 3%");
return orcamento.getValor() * 0.03;
}
return proximo.calculaDesconto(orcamento);
}
}
Seria isso uma boa prática ou acabei engessando código?