11
respostas

Posso implementar o método transfere dessa forma?

Quero saber se posso implementar o método transfere dessa forma ou existe forma melhor, mais limpa:

public boolean transfere(double valor, Conta destino) {
        boolean sucessoSaque = saca(valor);
        if(sucessoSaque) {
            destino.deposita(valor);
            return true;
        }
        return false;
    }
11 respostas

Desse jeito está bem limpo.

Mas se quiser eliminar mais uma linha:

public boolean transfere(double valor, Conta destino) {
        if(saca(valor)) {
            destino.deposita(valor);
            return true;
        }
        return false;
    }

Obrigado pela rápida resposta Edson!

Na verdade eu pensei desse jeito que você colocou, mas o Paulo comenta sobre a legibilidade do código e achei por bem criar uma variável dedicada pra usar no if.

Pelo menos a ideia do código tá correta né?

Obrigado mais uma vez!

Oi, Flávio.

Sim, a ideia está correta.

Para a resolução do exercício a ideia esta correta.

Mas se fosse uma aplicação real você poderia ter problemas, pois uma transferência geraria um registro de transferência, que é diferente de um registro de um saque mais um registro de deposito.

O que eu quero que você perceba é que numa aplicação real seu código passaria uma informação errada ao usuário.

Obrigado Edson!

Bom dia Vinícius, não entendi muito bem o que você quer dizer. Seria sobre o retorno ser true depois de efetuar o depósito?

Se quiser dar um exemplo de uma aplicação real, fique a vontade, só estou tentando fazer os exercícios de acordo com o que foi apresentado no curso até agora!

Repare que no seu código você esta reaproveitando o método "Saque" para realizar uma transferência.

Em uma aplicação real você teria que salvar não apenas o saldo do seu cliente, como também guardar um registro da movimentação que ele esta realizando.

Então supondo que um usuário realize uma transferência, então no registro de movimentação iria ser gravado a informação que aconteceu uma operação de "Saque". Pois para realizar a função de transferência é chamado o método que realiza o saque.

Outro motivo para não reaproveitar funções de Saque e Deposito, é que uma transferência aplica um conceito chamado de Transação. Em que você tem que aplicar mecanismo para garantir que o dinheiro que foi subtraído em um conta seja acrescentado na conta de destino desta transferência.

Obrigado pela explicação Vinícius!

Mas na verdade não sei se concordo, o exemplo do curso é pra dar um início a reaproveitamento de código e os retornos dos métodos são independentes. Eu posso muito bem pegar o retorno do método transfere e a partir dele indicar que foi uma operação de transferência.

A garantia que o dinheiro foi subtraído vem do método saca, se não foi, ele vai retornar false. E a garantia da transferência vem do próprio método transfere.

Sou novato e posso estar falando besteira, mas é assim que estou enxergando as coisas de acordo com o curso.

Reaproveitar código é uma ótima maneira de programar.

Mas no exemplo do Vinícius realmente não teria como, pois as transações são registradas. Então se fosse reaproveitar o sacar no método transfere estaria guardado no registro um saque, um depósito e uma transferência.

Agora entendi! Desculpa a burrice!

No exemplo do Vinícius não seria possível reaproveitar código então? Teríamos que duplicar código na verdade, para ter os registros corretos, certo?

Bom, ao menos tenho algo pra pensar em termos de como modelar métodos que possam ser reutilizados, mas que ao mesmo tempo não registrem suas ações o tempo todo. Se alguém tiver material para leitura, agradeço!

Não necessariamente duplicar o código. Acredito que daria para extrair em métodos pequenos e reaproveitar.

É, eu até pensei se poderíamos criar um parâmetro dentro de cada método e setar caso ele fosse usado em outro método e se tivesse setado, não registraria, mas ai ficaria mais com cara de função, que me lembra programação procedural, que é o que Orientação a Objeto tenta resolver.