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

Ajuda pra melhorar o meu código

Que código de iniciante sempre tem espaço pra melhoria não há duvidas, o importante é que foi bem sofrido(sim, sofrer é importante) chegar nessa parte e gastar uma semana de estudo pra entender o que tá acontecendo.

pra dar um resumo, eu tentei praticar as técnicas nas contas corrente e poupança, fiz uma interface e uma composição de movimentações, infelizmente eu não consegui deixar de "estender" a conta para essa composição, pra isso eu teria que deixar o saldo dentro dessa composição, e eu não sei se seria uma boa ideia, pra mim o saldo deveria ser da conta e não dos métodos de movimentação

public abstract interface InterfaceDeMovimentacoesEExtratos 
{

     void deposita(double valor);

     boolean saca(double valor);

     boolean transfere(double valor, InterfaceDeMovimentacoesEExtratos destino);

}
public class ComposicaoDeMovimentacoesEExtratos extends Conta implements InterfaceDeMovimentacoesEExtratos
{ 

    @Override
    public void deposita(double valor) 
    {
        this.saldo += valor;
    }

    @Override
    public boolean saca(double valor)
    {
        if(getSaldo() >= valor) 
         {
             this.saldo -= valor ;
             return true;
         } 
         else 
         {
             return false;
         }
     }

    @Override
    public boolean transfere(double valor, InterfaceDeMovimentacoesEExtratos destino) 
    {
        if(this.saca(valor)) 
        {
            destino.deposita(valor);
            return true;
        } 
        else 
        {
            return false;
        }
    }
}

Aqui está a classe Conta com código omitido porque tá igual da aula, mostrando apenas o inicio

public abstract class Conta  
{


    private int agencia;
    private int numeroDaConta;
    private Cliente titular;
    protected double saldo;


    public double getSaldo() 
    {
        return this.saldo;
    }

As classes das contas corrente e poupança recebem a interface e composição de movimentação.

public class ContaPoupanca extends Conta implements InterfaceDeMovimentacoesEExtratos  
{

    protected ComposicaoDeMovimentacoesEExtratos movimentacao;

    public ContaPoupanca() 
    {    
        this.movimentacao = new ComposicaoDeMovimentacoesEExtratos();
    }

    @Override
    public void deposita(double valor)  
    {
        this.movimentacao.deposita(valor);

    }

    @Override
    public boolean saca(double valor) 
    {
        boolean sacou = this.movimentacao.saca(valor);
        return sacou;
    }

    @Override
    public boolean transfere(double valor, InterfaceDeMovimentacoesEExtratos destino) 
    {
        boolean transferiu = this.movimentacao.transfere(valor, destino);
        return transferiu;
    }

    @Override
    public double getSaldo() 
    {

        this.movimentacao.saldo -= 1.25;
        return this.movimentacao.saldo;
    }
 }
public class ContaCorrente extends Conta implements InterfaceDeMovimentacoesEExtratos 
{
    protected ComposicaoDeMovimentacoesEExtratos movimentacao;

    public ContaCorrente() 
    {
          this.movimentacao = new ComposicaoDeMovimentacoesEExtratos();        
    }
    @Override
    public void deposita(double valor)   
    {
        this.movimentacao.deposita(valor);
    }

    @Override
    public boolean saca(double valor) 
    {
        boolean sacou = this.movimentacao.saca(valor);
        return sacou;
    }

    @Override
    public boolean transfere(double valor, InterfaceDeMovimentacoesEExtratos destino) 
    {
        boolean transferiu = this.movimentacao.transfere(valor, destino);
        return transferiu;
    }

    @Override
    public double getSaldo() 
    {

            this.movimentacao.saldo -= 3.50;
            return this.movimentacao.saldo;
    }
}

usei o Java 1.8 mesmo, e nem preciso dizer que esse código funcionou na minha maquina =D

E então? o que eu posso ter deixado passar? foi muito errado ter herdado a classe conta dentro da composição de movimentação pra usar o saldo?

Um abraço

3 respostas
solução!

Fala João.

A meu ver ficou muito bom. Talvez em outro contexto você pudesse trabalhar com Generics. Talvez você pudesse criar uma Interface para Conta que teria o saldo e uma interface Operacoes (Movimentações) para o restante. Daí as classes ContaCorrete e Poupança implementariam as duas interfaces.

Assim:

class ContaCorrente implements IConta, IOperacoes { ... 

Algo do tipo... Mas no geral você mandou bem!

Opa Allan, obrigado por responder, meu caro.

Eu não sei nada sobre Generics ainda, e pelo que eu pesquisei ainda vai demorar pra eu chegar lá, então não saberia como usar isso agora dentro das minhas limitações, talvez seja esse o outro contexto que você mencionou.

O outro ponto é que sua sugestão envolve retirar a herança, algo que o Nico mencionou que hoje em dia faz parte da maior pratica dos desenvolvedores(se eu não tiver entendido errado), e retirar a herança significa que as variáveis que são padrão para as duas contas deixarão de existir para serem implementadas em todos os tipos de conta possíveis, felizmente pra esse caso acho que até funciona, pois em um banco não existe tanta coisa além de conta corrente e poupança, mas será que em outra aplicação a herança não resolve boa parte da questão sobre reutilizar código em vez de ter vários códigos iguais em varias classes parecidas? Algo que a herança resolve muito bem por sinal. eu fico divagando nisso porque meu conhecimento ainda é super limitado. uma hora vai rolar um "trade off" entre utilizar herança ou outro método.

Mas de ter alguém mais experiente pra dizer que o código tá bom já fico muito feliz, aprecio sua colaboração. Um abraço e obrigado.

Imagina João, sempre é bom a gente se ajudar. Ainda tenho muito arroz com feijão pra comer. kkk

Questões conceituais sempre trazem um "depende" junto. Depende do cenário, depende do momento, da abordagem... Uma linha muito boa para estudo é ver os prós e contras de cada um dos lados, no caso de Herança x Composição. Mas acredito que em muitos casos você vai optar pela composição em vez de herança.

Forte abraço e bons estudos!