Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
17
respostas

25% de imposto

Os 25% de imposto não deveriam ser definidos dentro dos investimentos ao invés de dentro do Realizador de investimento? Ou, se fosse o caso, definir um método extra na interface de calculo de imposto e definir nos investimentos, pois um dos impostos pode mudar ou pode aparecer um investimento sem imposto ( estilo a poupança por exemplo )

17 respostas

Oi Samir, na minha opinião o imposto não é responsabilidade da implementação do investimento em si. Até pq o tempo do investimento, para alguns investimentos, pode influenciar no imposto a ser cobrado... Se vc não acopla, você consegue mexer nos impostos sem alterar nada das classes...

Caso você realmente queira delegar isso para o investimento, vc podia ter uma classe responsável por isso e fazia com que o investimento recebesse um objeto deste tipo como argumento no construtor.

Imaginei algo assim:

    public interface Investimento
    {
        double Calculo(Conta conta);
        double CalculaImposto(double valor);
    }

    public class Conservador : Investimento
    {
        public double Calculo(Conta conta)
        {
            double resultado = 0;
            double saldo = 0;
            double valor = conta.Saldo;

            saldo = valor * 0.008;  //-- 0,8 %

            resultado = valor + saldo;

            return resultado;
        }
        public double CalculaImposto(double valor)
        {
            double valorImposto = 0;

            valorImposto = valor * 0.25;   //-- Imposto de 25%

            return valorImposto;
        }
    }

Assim, todo tipo de investimento vai carregar consigo o calculo de imposto também, e caso algum imposto mude de valor não é preciso começar a fazer uma cascata de ifs...

O problema aí é que vc pode passar qualquer valor como argumento do método CalculaImposto... A operação tinha que ser uma só...

Não entendi o que você quer dizer Alberto, no caso o problema seria usar uma variável do tipo double ao invés de uma classe para calcular esse valor?

Imaginei que seria assim:

    public class RealizadorDeInvestimentos
    {
        public double Calculo(Conta conta, Investimento perfilInvestimento)
        {
            double valorInvestimento = perfilInvestimento.Calculo(conta);

            valorInvestimento -= perfilInvestimento.CalculaImposto(valorInvestimento);

            conta.Deposita(valorInvestimento);

            return valorInvestimento;
        }
    }

É bem esse código que vc postou.. parece obvio que o double que eu vou passar para o método CalculaImposto é o valor que foi retornado pelo método Calculo.. O problema é que não tem obrigatoriedade... Isso deveria ser uma operação só.

Mas como poderia ser uma operação só, se o imposto fosse diferente para cada investimento?

O imposto poderia ser parâmetro do método que calcula em si...

Não entendi, seria parâmetro de qual classe? RealizadorDeInvestimentos, Conservador/Moderado/Arrojado?

public double Calculo(Conta conta,CalculadorImposto calculador)
        {
            double resultado = 0;
            double saldo = 0;
            double valor = conta.Saldo;

            saldo = valor * 0.008;  //-- 0,8 %

            resultado = valor + saldo;

            return calculador.cobraImposto(resultado);
        }

Nesse caso, seria então das classes dos tipos de investimento, certo?

Teria que criar uma classe a mais para cada tipo de investimento e passaria a poder criar um novo investimento sem criar o calculadorImposto correspondente e ainda poderia passar o calculador de imposto de outro tipo de investimento....

Acredito que minha solução seria mais simples...

Bom, tava achando que vc teria categorias de imposto... Então vc pode fazer assim:

public double Calculo(Conta conta,double imposto)
        {
            double resultado = 0;
            double saldo = 0;
            double valor = conta.Saldo;

            saldo = valor * 0.008;  //-- 0,8 %

            resultado = valor + saldo;

            return resultado * (1 - imposto);
        }

Dado que o imposto seria 15% ou algo assim. Tudo depende do nível de proteção que vc quer mesmo.

Mas teria categoria de imposto, uma para cada tipo de investimento, e setar como parâmetro e calcular não seria "pior" ou ao menos similar do que executar o comando de calcular o Imposto ?

Para mim não seria pior. Para mim tem poucas coisas que sao piores do que código onde o programador tem que saber uma sequência exata de métodos dentro da mesma classe que precisam ser invocados.

Do jeito que vc sugeriu, eu teria que saber que o Double esperado no segundo método eh o resultado do primeiro. Toda solução de código tem ponto fraco e forte.. A que eu estou sugerindo tem a parte de criar mais classes.. em compensação faz com que vc possa reaproveitar os cálculos ebtre investimentos diferentes e também garante que o cálculo eh feita numa sequencia só.

Para mim eh isso... Não tem a melhor e a pior... Tem as possibilidades e o tradeoff de cada uma.

Concordo que não tem um modo de definir que o resultado de um local vai ser passado para o outro método, assim como não teria como definir que o resultado final deve subtrair do total:

return resultado * (1 - imposto);

Então, só para constar aqui :). Estamos falando de coisas diferentes.. o meu exemplo é de uma pessoa não familiarizada com a api tentando usar uma classe... O exemplo que vc deu é da pessoa implementando uma regra de negócio e fazendo isso de forma errada... Contra essa segunda, não tem nada que se possa fazer.. a pessoa esquecer de implementar a lógica é algo que só um teste poderia pegar.

São duas coisas muito interligadas né, a necessidade de passar o resultado também poderia ser encarado como implementação da lógica certo... Mas, para melhorar essa implementação acredito que deveria ser criado um atributo a ser acessado pelos 2 métodos e substituir o uso da variável, teria como definir uma variável double que possa ser acessado pelas 2 classes para assim não necessitar mais da variável valorInvestimento

solução!

Alberto, obrigado pela ajuda, deu para entender que é algo muito abstrato, vou finalizar o tópico.