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

Estou com dúvida no curso de Design Patterns para bons programadores, no exercício do capítulo A grande variedade de impostos e o padrão Strategy.

No caso do método:

        public double calcula(Orcamento orcamento) {
          if(orcamento.getValor() < 1000) {
            return orcamento.getValor() * 0.05;
          }
          else if (orcamento.getValor() >= 1000 && orcamento.getValor() <= 3000) {
            return orcamento.getValor() * 0.07;
          }
          else {
            return orcamento.getValor() * 0.08 + 30;
          }
        }
      }

o segundo IF, que trata o orcamento.getValor(). Há realmente a necessidade da condição orcamento.getValor() >= 1000, sendo que se orcamento.getValor() não for menor do que mil, o aplicativo já vai pular para o segundo if? Eu poderia escrever o método como abaixo ou não estou considerando alguma possibilidade?

    public double calculaImposto(Orcamento orcamento) {
        if(orcamento.getValor() > 1000) {
            return orcamento.getValor() * 0.05;
        } else if (orcamento.getValor() <= 3000) {
            return orcamento.getValor() * 0.07;
        } else if (orcamento.getValor() > 3000) {
            return orcamento.getValor() * 0.08 + 30;
        }
    }
4 respostas

Acho que você se confundiu, Luis.

Ao inverter a condicional de menor (<) para maior (>) no primeiro if, você só vai considerar valores acima de 1000 reais. Esse cálculo do imposto de 0.05 são para valores menores que 1000.

Da forma como você colocou, qualquer valor acima de 1000 vai entrar sempre no primeiro if. Para entrar no segundo if, tem que ser menor do que 1000, o que também não está certo, já que queremos somente valores entre 1000 e 3000.

Pior ainda fica o terceiro if, que nunca será chamado dessa forma, pois qualquer valor acima de 3000 já foi tratado no primeiro.

solução!

Sim, a cadeia de ifs poderia ser escrita dessa forma, mas como disse o Arthur você inverteu o sinal do primeiro if que fez com que o bloco inteiro se torne errado.

Ah, sim. Eu inverti o sinal, puta cagada. rsrs... Mas se o sinal estivesse certo, a cadeia de ifs poderia ser escrita assim, né? Valeu.

Sim. Com a primeira condição sendo menor do que 1000 dá certo. Você não precisaria verificar se é maior ou igual a 1000, bastaria verificar se é menor ou igual do que 3000