Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Não vou precisar fazer IF e ELSE na instância das Classes?

Boa tarde. Sobre a aula de Design Patterns em Java, que fala sobre a Técnica Strategy. Criou as classes ISS e ICMS com a Interface Imposto, para evitar os IFs e ELSEs. Mas na instância das classes eu não vou precisar fazer IFs ? A classe de testes ficou dessa maneira:

public static void main(String[] args) {

    Orcamento orcamento = new Orcamento(new BigDecimal("100"));
    CalculadoraDeImpostos calculadora = new CalculadoraDeImpostos();
    System.out.println(calculadora.calcular(orcamento, new ISS()));

}

Pensando na tela do sistema, vou ter a seleçao do tipo de Imposto, e dependendo de qual foi selecionado vou precisar fazer o IF, por exemplo:

public static void main(String[] args) {

    Orcamento orcamento = new Orcamento(new BigDecimal("100"));
    CalculadoraDeImpostos calculadora = new CalculadoraDeImpostos();
    if (tipoImposto == "ICMS"){
            System.out.println(calculadora.calcular(orcamento, new ICMS()));
    }else{
            System.out.println(calculadora.calcular(orcamento, new ISS()));
    }
}

Como eu poderia resolver essa questão? Ainda sou bem leigo em Java. Obrigado.

2 respostas
solução!

Oi, boa tarde ^-^

Também estou iniciando no Java, mas acho que uma solução para isso seria criando uma nossa classe do tipo Enum e implementando o Strategy, você faria o seguinte:

Uma Classe TipoDeImposto do tipo enum.

public enum TipoDeImposto {

    ICMS {
        @Override
        void calcularImposto() {
            ///Regra para calcularImposto do tipo ICMS
        }
    },

    ISS {
        @Override
        void calcularImposto() {
            ///Regra para calcularImposto do tipo ISS
        }
    };

    abstract void calcularImposto();
}

Para chamar você usaria TipoDeImposto.ICMS.calcularImposto();

Com isso você pode ter regras dinstintas de imposto, e caso você adicione outras formas de calcular imposto, não ira afetar outras classes que usam o TipoDeImposto.ICMS.calcularImposto() ou seja você pode mexer adicionar ou remover tipos diferentes, sem quebrar o codigo já que o TipoDeImposto não sabe como está sendo calculado.

Caso você queria utilizar o Orcamento ou a CalculadoraDeImpostos

1º ─ você pode passar ela como parametro do método calcularImposto por exemplo:

abstract void calcularImposto(); ──> abstract void calcularImposto(Orcamento orcamento, CalculadoraDeImpostos calculadora); Eu não acho essa a melhor forma por 2 motivos, o primeiro é que você 'força' todas as classes a utilizarem a calculadora e o orcamento, caso você ache que todos os tipos de forma de imposto que você adicionar no futuro, irão ter que utilizar a calculadora e o orçamento você pode passar como paramento.

2º ─ você pode utilizar composição (eu acho bem mais interessante):

A composição seria criar um objeto, que irá ser utilizado por aquela classe por exemplo, eu criaria um objeto que calcula a porcentagem sobre o valor e faria o seguinte:

abstract void calcularImposto(); ──> abstract void calcularImposto(BigDecimal valor);

ICMS {
        @Override
        void calcularImposto(BigDecimal valor) {
            ///Regra para calcularImposto do tipo ICMS

            BigDecimal valorRetornadoDaCalculadora = Calculadora.calcularPorcentagem(valor, 5); /// <── eu criaria um Caculadora que calcularia a porcetagem de acordo com o valor e a porcentagem.

            System.out.println(valorRetornadoDaCalculadora);

        }
    },

Com isso você poderia definir varios métodos diferentes de calculos de pocentagem na calculadora, por exemplo supondo que o BigDecimal valor do parametro for = 100:

O console pode retorna 5% de 100 que é igual a 5. Pode reduzir esse valor de 5% do valor 100 então o console faria um print de 95. Pode somar esse valor com o 100 por exemplo, fazendo o console 'printar' 105.

Você pode criar essa classe Calculadora e adicionar todos esses métodos, e só utilizar o que você necessitar de acordo com a sua necessidade.

E por ultimo caso você queira trocar a regra ou o valor da porcentagem por exemplo do ICMS você só irá precisar trocar em 1 lugar facilitando a manutenção do código, e caso você queira adicionar uma nova forma de calcula você pode criar na calculadora e usar essa regra onde há necessidade.

Acho que é isso espero ter ajudado :)

Boa Jadson Macedo. Deu uma boa clareada na minha dúvida. Com Enum daria para fazer sem ficar colocando IFs no código. Valeu, obrigado