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

Implementação Investimentos (code-review)

Pessoal fiz um pouco diferente e gostaria da opinião de vocês.

package br.com.schimidtsolutions.estudo.investimento;

public interface Investimento {

    double calcularRendimentoLiquido(ContaBancaria contaBancaria);
}

package br.com.schimidtsolutions.estudo.investimento;

public class InvestimentoConservador implements Investimento {
    private static final double TAXA_RENTABILIDADE_UNICA = 0.008;
    private final Imposto imposto;

    public InvestimentoConservador(final Imposto imposto) {
        this.imposto = imposto;
    }

    public InvestimentoConservador() {
        this(new ImpostoPadrao());
    }

    @Override
    public double calcularRendimentoLiquido(final ContaBancaria contaBancaria) {
        return imposto.calcularValorLiquidoSobreLucro(contaBancaria.getSaldo() * TAXA_RENTABILIDADE_UNICA);
    }
}

package br.com.schimidtsolutions.estudo.investimento;

import java.util.Random;

public class InvestimentoModerado implements Investimento {
    private static final double TAXA_RENTABILIDADE_MAXIMA = 0.025;
    private static final double TAXA_RENTABILIDADE_MINIMA = 0.007;

    private final Imposto imposto;
    private final Random geradorNumeroRandomico;

    public InvestimentoModerado(final Imposto imposto) {
        this.imposto = imposto;
        this.geradorNumeroRandomico = new Random();
    }

    public InvestimentoModerado() {
        this(new ImpostoPadrao());
    }

    private double calcularTaxaRentabilidade() {
        return geradorNumeroRandomico.nextInt(2) == 0 ? TAXA_RENTABILIDADE_MAXIMA : TAXA_RENTABILIDADE_MINIMA;
    }

    @Override
    public double calcularRendimentoLiquido(final ContaBancaria contaBancaria) {
        final double lucroRealizado = contaBancaria.getSaldo() * calcularTaxaRentabilidade();

        return imposto.calcularValorLiquidoSobreLucro(lucroRealizado);
    }
}

package br.com.schimidtsolutions.estudo.investimento;

import java.util.Random;

public class InvestimentoArrojado implements Investimento {
    private static final double TAXA_RENTABILIDADE_MAXIMA = 0.05;
    private static final double TAXA_RENTABILIDADE_MEDIANA = 0.03;
    private static final double TAXA_RENTABILIDADE_MINIMA = 0.006;

    private final Imposto imposto;
    private final Random geradorNumeroRandomico;

    public InvestimentoArrojado(final Imposto imposto) {
        this.imposto = imposto;
        geradorNumeroRandomico = new Random();
    }

    public InvestimentoArrojado() {
        this(new ImpostoPadrao());
    }

    @Override
    public double calcularRendimentoLiquido(final ContaBancaria contaBancaria) {
        final double lucroRealizado = contaBancaria.getSaldo() * calcularTaxaRentabilidade();

        return imposto.calcularValorLiquidoSobreLucro(lucroRealizado);
    }

    private double calcularTaxaRentabilidade() {
        final int chanceSorteada = geradorNumeroRandomico.nextInt(10);
        double rentabilidadeSelecionada = 0;

        if (chanceSorteada <= 1) {
            rentabilidadeSelecionada = TAXA_RENTABILIDADE_MAXIMA;

        } else if (chanceSorteada <= 4) {
            rentabilidadeSelecionada = TAXA_RENTABILIDADE_MEDIANA;

        } else {
            rentabilidadeSelecionada = TAXA_RENTABILIDADE_MINIMA;
        }

        return rentabilidadeSelecionada;
    }
}

package br.com.schimidtsolutions.estudo.investimento;

public class ContaBancaria {
    private final String cliente;
    private double saldo;

    public ContaBancaria(final String cliente, final double valor) {
        this.cliente = cliente;
        saldo = valor;
    }

    public String getCliente() {
        return cliente;
    }

    public double getSaldo() {
        return saldo;
    }

    public void depositar(final double valorDeposito) {
        saldo += valorDeposito;
    }

    @Override
    public String toString() {
        return String.format("ContaBancaria [cliente=%s, saldo=%s]", cliente, saldo);
    }
}

package br.com.schimidtsolutions.estudo.investimento;

public interface Imposto {

    double calcularValorLiquidoSobreLucro(double valorBruto);
}

package br.com.schimidtsolutions.estudo.investimento;

public class ImpostoPadrao implements Imposto {

    @Override
    public double calcularValorLiquidoSobreLucro(final double valorBruto) {
        return valorBruto * 0.75;
    }
}

package br.com.schimidtsolutions.estudo.investimento;

public class RealizadorDeInvestimentos {

    public void executarInvestimentoSobreConta(final Investimento investimento, final ContaBancaria contaBancaria) {
        final double lucroLiquido = investimento.calcularRendimentoLiquido(contaBancaria);

        contaBancaria.depositar(lucroLiquido);

        System.out.println(contaBancaria);
    }
}
2 respostas
solução!

Oi Felipe, o legal da sua versão é que vc pode reaproveitar o Imposto para outras situações :). O ponto que não é bem negativo, mas que vc deve ficar atento, é se a regra de negócio indica que o investimento pode ter um imposto variável... Do jeito que vc fez, um outro programador que pegar o seu código pode instanciar o investimento e passar um imposto que não se aplica a ele...

Talvez, nesse caso, o melhor seria deixar o investimento como foi mostrado no exercício, focado em apenas calcular a rentabilidade e aí sim, depois, usar a sua classe de imposto para pegar o valor total ganho e calcular quando deve ser pago de imposto.

Na verdade quando fiz pensei isso em Investimentos com impostos variáveis e que com isso tivesse essa flexibilidade sem ter que alterar o código da classe RealizadorDeInvestimentos, aplicando Open Close Principle. Mas bacana o que vc falou tbm.