Não realizar transacao se saldo < saque/transferencia

8 respostas
R

Boa noite...

Por gentileza, se alguém puder me ajudar.

Tenho duas classes, Cliente e ValidarMetodos, esta última que valida os métodos saque e transfereDinheiro.
public class Cliente 
{
	private String nome;
	private double saldo;
	private double saque;
	
	public Cliente(String nome, double saldo)
	{
		this.setNome(nome);
		this.setSaldo(saldo);
	}
	
	public String getNome()
	{
		return this.nome;
	}
	
	public void setNome(String nome)
	{
		this.nome = nome;
	}
	public double getSaldo()
	{
		return this.saldo;
	}
	
	private void setSaldo(double saldo)
	{
		this.saldo = saldo;
	}
	
	public boolean saque(double valor)
	{
		this.saldo -= valor;
		return ValidarMetodos.validarSaque(saque, saldo);
	}
	
	public void deposita(double valor)
	{
		this.saldo += valor;
	}
	
	public void transfereDinheiro(Cliente destino, double valor)
	{
		this.saque(valor);
		destino.deposita(valor);
	}
}
public class ValidarMetodos 
{
	public static boolean validarSaque(double saque, double saldo)
	{
		if(saque < saldo)
		{
			System.out.println("Transacao autorizada e realizada!!!");
		}
		else
		{
			System.out.println("Transacao NAO autorizada, pois seu e saldo insuficiente!!!");
		}
		return false;
	}
}
Quando o saque/transferencia e menor que o saldo, sem problemas, as contas são atualizadas normalmente, e a seguinte mensagem é exibida no console:
public class Application 
{
	public static void main(String[] args)
	{
		Cliente neiva = new Cliente("Neiva", 1000);
		Cliente rodrigo = new Cliente("Rodrigo", 1000);
		neiva.transfereDinheiro(rodrigo, 450);
		System.out.println("NEIVA " + neiva.getSaldo());
		System.out.println("RODRIGO " + rodrigo.getSaldo());
	}
}

Transacao autorizada e realizada!!!
NEIVA 550.0
RODRIGO 1450.0

Porém, quando a situação é inversa o saldo aparece negativo e ao meu entender a operação é realizada da mesma forma, como posso fazer com que sem saldo a operação não seja realizada?
public class Application 
{
	public static void main(String[] args)
	{
		Cliente neiva = new Cliente("Neiva", 1000);
		Cliente rodrigo = new Cliente("Rodrigo", 1000);
		neiva.transfereDinheiro(rodrigo, 2222450);
		System.out.println("NEIVA " + neiva.getSaldo());
		System.out.println("RODRIGO " + rodrigo.getSaldo());
	}
}
Transacao NAO autorizada, pois seu e saldo insuficiente!!! NEIVA -2221450.0 RODRIGO 2223450.0

Eu não queria que o saldo fosse negativo porque não deveria nem ser realizado o saque/transferencia por falta de fundos.

Muito obrigado!!!
Rodrigo
[size="11"][color="red"]* Editado: Lembre-se de utilizar BBCode em seus códigos - Cassolato[/color][/size] :joia:

8 Respostas

J

public boolean saque(double valor){ if(saldo>=valor){ saldo -= valor; System.out.println("Saque realizado com sucesso"); return true; }else{ System.out.println("Saldo insuficiente"); return false; } }

L

Além do que o Jair falou, vc tb tem que cuidar no deposito da outra conta… se o saque retorna false, você não pode depositar… do jeito que tah, você primeiro faz o saque para depois validar se pode, e no validar vc sempre retorna false, no geral vc não valida nada antes de fazer um saque de um cliente e um deposito no outro… tb acho que não faz sentido ter um atributo saque para cliente hehe

public boolean saque(double valor)
   {
      this.saldo -= valor;
      return ValidarMetodos.validarSaque(saque, saldo);
   }

Acho que teria que mudar essas coisas, validar, se ñão tiver saldo, retorna false, se retornou false, não faz o saque, que retorna false, se o saque não foi feito, não faz o deposito na outra conta :razz:
Da uma olhada nessas alterações que fiz:

método saque

public boolean saque(double valor)
   {
      if (ValidarMetodos.validarSaque(valor, saldo))
      {
         this.saldo -= valor;
         return true;
      }
      return false;
   }

método transfere dinheiro

public void transfereDinheiro(Cliente destino, double valor)
   {
      if (saque(valor))
      {
         destino.deposita(valor);
      }
   }

método validar saque

public static boolean validarSaque(double saque, double saldo)
   {
      if (saque < saldo)
      {
         System.out.println("Transacao autorizada e realizada!!!");
         return true;
      }
      else
      {
         System.out.println("Transacao NAO autorizada, pois seu e saldo insuficiente!!!");
         return false;
      }
   }

é uma solução, talvez não a melhor, eu acho que vc poderia disparar um exception quando não tivesse saldo, ai evitaria essa de if true da vida… mas não sei se vc ja aprendeu exception, então vai a solução mais simples…

valeu :wink:

R

“jairelton”:
public boolean saque(double valor){ if(saldo>=valor){ saldo -= valor; System.out.println("Saque realizado com sucesso"); return true; }else{ System.out.println("Saldo insuficiente"); return false; } }

Muito obrigado pela atenção e desculpe-me pela dúvida nível zero…

R

Muito obrigado pela atenção e desculpe-me pela dúvida nível zero…

R

“luBS”:
Além do que o Jair falou, vc tb tem que cuidar no deposito da outra conta… se o saque retorna false, você não pode depositar… do jeito que tah, você primeiro faz o saque para depois validar se pode, e no validar vc sempre retorna false, no geral vc não valida nada antes de fazer um saque de um cliente e um deposito no outro… tb acho que não faz sentido ter um atributo saque para cliente hehe

public boolean saque(double valor)
   {
      this.saldo -= valor;
      return ValidarMetodos.validarSaque(saque, saldo);
   }

Acho que teria que mudar essas coisas, validar, se ñão tiver saldo, retorna false, se retornou false, não faz o saque, que retorna false, se o saque não foi feito, não faz o deposito na outra conta :razz:
Da uma olhada nessas alterações que fiz:

método saque

public boolean saque(double valor)
   {
      if (ValidarMetodos.validarSaque(valor, saldo))
      {
         this.saldo -= valor;
         return true;
      }
      return false;
   }

método transfere dinheiro

public void transfereDinheiro(Cliente destino, double valor)
   {
      if (saque(valor))
      {
         destino.deposita(valor);
      }
   }

método validar saque

public static boolean validarSaque(double saque, double saldo)
   {
      if (saque < saldo)
      {
         System.out.println("Transacao autorizada e realizada!!!");
         return true;
      }
      else
      {
         System.out.println("Transacao NAO autorizada, pois seu e saldo insuficiente!!!");
         return false;
      }
   }

é uma solução, talvez não a melhor, eu acho que vc poderia disparar um exception quando não tivesse saldo, ai evitaria essa de if true da vida… mas não sei se vc ja aprendeu exception, então vai a solução mais simples…

valeu :wink:

Muito obrigado pela atenção e desculpe-me pela dúvida nível zero…

R

Desculpe-me pelo palavreado a seguir, ptz meu prezado amigo, deu certissimo o que você me passou, muito obrigado novamente, resta agora para mim entender as alterações, eu estou no começo, nem sou programador, sou assist adm, me apaixonei por java, mas é muito difícil sozinho, em todo caso, não quero parar, desanimei varias vezes, é muito difícil sozinho…

L

é tudo uma questão de lógica, pensa assim, vc quer fazer uma transferencia, para isso tem que sacar dinheiro de uma conta, se essa conta não conseguir sacar dinheiro, então a transferencia não acontece. E para sacar dinheiro de uma conta, ela precisa ser validada, se essa validação disser: “não pode sacar”, o saque não acontece.

da maneira como vc tinha feito, o seu saque tava assim:

public boolean saque(double valor)
   {
      this.saldo -= valor;
      return ValidarMetodos.validarSaque(saque, saldo);
   }

isso ai pega e diminui direto ja o valor a ser transferido do saldo, sem validar nada, então o certo seria:

public boolean saque(double valor)
   {
      if (ValidarMetodos.validarSaque(valor, saldo))
      {
         this.saldo -= valor;
         return true;
      }
      return false;
   }

Explicando, antes de diminuir o valor do saldo (efetuar o saque que é o “this.saldo -= valor”), vc vai chamar seu método de validação (que vai validar se o saque pode ser feito), passando o quanto de saldo vc tem e quanto vc quer tirar… se a validação retornar “validei e esta ok” (que significa a validação retornar true), ele diminui o saldo e retorna do saque “o saque foi feito” (que é o significado return true), se a validação retornar “validei e não tá ok” (que significa a validação retornar false), então ele não diminui o saldo e retorna do saque “o saque não foi feito” (que significa o return false).

Essa é a explicação apenas da logica de saque… o problema dois esta na sua validação, se vc olhar a sua antiga função de validação ela sempre retorna false (que significa em termos de negócio: “validei e não tem saldo, não pode fazer o saque”), ou seja, vc nunca vai dizer: “aham, pode sacar”… por isso que agora tem dois return’s la, um true para quando tiver saldo e pode efetuar o saque e um false que retorna quando não tem saldo e não pode efetuar o saque.

Essas duas alterações fazem com que vc impessa de fazer o saque de uma conta se ela não tiver saldo, mas ainda falta não fazer nenhuma transferencia para outra conta caso o saque da primeira não foi feito, ai parte do mesmo principio:

public void transfereDinheiro(Cliente destino, double valor)
   {
      if (saque(valor))
      {
         destino.deposita(valor);
      }
   }

se o saque foi feito (ou seja, o método saque retornar true, que significa “sim, eu realizei o saque”), então vc vai fazer o deposito desse valor na conta de destino, mas se o saque retornar false, que significa “não efetuei o saque”, então vc não vai fazer o deposito.

é tudo meio que troca de mensagens, nesse caso a mais simples que são valores booleanos (sim/não, true/false, pode/não pode, ok/não ok).

blz?
dica, se vc nunca estudou programação, aconselho dar uma lida em alguns tutoriais de lógica, para aprender os tipos basicos, as estruturas de condição, repetição, sequencial, etc

valeu!

R

Muito obrigado meu prezado amigo, agradeço novamente por sua educação e atenção, entendi perfeitamente agora.

valeu rs

Criado 24 de outubro de 2006
Ultima resposta 27 de out. de 2006
Respostas 8
Participantes 3