Orienté Objet

Résolu/Fermé
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017 - Modifié par KX le 3/10/2016 à 18:40
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017 - 3 oct. 2016 à 20:57
Bonjour, Voilà j'suis sûr un mini programme qui consiste à faire divers opérations à savoirs des retraits , des dépôts et des virements bancaires toute fois en arrivant à la méthode virements je présente quelques lacunes quant à la réflexion de la méthode. C'est un peut par hasard que j'ai réussi a y arriver mais j'ai du mal à comprendre comment le programme arrive a différencier qu'il faut faire un dépôt dans l'Objet 1 (compte1) et un retrait dans l'Objet 2 (compte2) .

public void retrait( double montantRetrait) {
  solde = solde - montantRetrait;
 }

public void depot( double depotMontant) {
  solde = solde + depotMontant;
 }

public void virement( CompteEnBanque compte, double montantEnvoyer) {
  compte.depot(montantEnvoyer);
                .retrait(montantEnvoyer);
}

2 réponses

Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 649
3 oct. 2016 à 12:10
Salut,

Effectivement tu as mal fait, il ne faut pas appeler les 2 car ça veut dire que tu peux déposer et retirer en même temps.

Il ne fait que l'un des 2 car si tu déposes, je supposes que ta variable de retrait est à 0 donc solde - retrait = solde.

Mais modifies ton programme, il fonctionne mais ce n'est pas "propre".
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
3 oct. 2016 à 13:15
Merci Pour votre intervention , Mais le programme fonctionne quand j'depose un montant dans un compte1 , le montant déposé et automatiquement débité sur le compte2 C'est sa qui m'a interpellé justement. Mais c'est la seule méthode que j'ai trouvé j'vois pas d'autre alternative pour débiter un compte et en crédité un autre mis à part le fait de passé par des méthodes tels que le dépôt et le retrait.
0
Pierre1310 Messages postés 8564 Date d'inscription lundi 21 décembre 2015 Statut Membre Dernière intervention 21 juillet 2020 649
3 oct. 2016 à 13:56
Je ne comprends pas comment tu t'es débrouiller, tu utilises une interface web? Si oui, tu n'as qu'à faire un bouton pour créditer et un autre bouton pour débiter. Ou permettre un choix (cases à cocher, liste déroulante) permettant de choisir le mode.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 3/10/2016 à 19:04
Bonjour,

"comment le programme arrive a différencier qu'il faut faire un dépôt dans l'Objet 1 (compte1) et un retrait dans l'Objet 2 (compte2)"
Chaque objet disposes de son propre espace mémoire. Donc l'attribut
solde
est propre à chaque objet.
Quand tu fais
compte1.depot(42)
cela va augmenter le solde enregistré dans la mémoire de l'objet compte1, et quand tu fais
compte2.retrait(42)
cela va diminuer le solde enregistré dans la mémoire de l'objet compte2.
compte1.solde
et
compte2.solde
sont deux valeurs différentes.

"j'vois pas d'autre alternative pour débiter un compte et en crédité un autre mis à part le fait de passé par des méthodes tels que le dépôt et le retrait"
Ce que tu as fait n'est pas faux techniquement, même si sémantiquement on ne fait pas vraiment un retrait/dépôt mais plutôt un crédit/débit.
Ce serait bien par contre de mieux nommer tes paramètres afin de lever l’ambiguïté de savoir qui envoie/reçoit l'argent.

public void debit(double montant) {
    solde -= montant;
}

public void credit(double montant) {
    solde += montant;
}

public void retrait(double montant) {
    debit(montant);
}

public void depot(double montant) {
    credit(montant);
}

public void virement(CompteEnBanque destinataire, double montant) {
    this.debit(montant);
    destinataire.credit(montant);
}

La confiance n'exclut pas le contrôle
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
Modifié par KX le 3/10/2016 à 20:06
Merci pour votre intervention , mais par exemple Quand je fait la méthode virement et que j'utilise le compte passé en paramètre pour effectuer un débit et un crédit les 2 comptes dans ma classe tests qui sont impliqués dans la transaction ne débites et ne crédites pas comme il faut :

public void virement( CompteEnBanque compte, double montant) {
  compte.depot(montant);
  compte.retrait(montant);
 }


C'est pour sa que je comprends pas pourquoi on utilise compte pour fait un dépôt
compte.depot(montant);


Mais lorsque j'essaie d'utiliser le même compte passé en paramètre pour faire un retrait sa ne fonctionne pas.
compte.retrait(montant);


du coup c'est sa qui accentue cette ambiguïté pourquoi on utilise le compte pour invoqué la méthode dépôt mais qu'on ne peut pas utiliser compte pour invoquer la méthode retrait. Et du coup puisque quand on utilise compte.depot(montant) comment mon programme sait que c'est un compte x qu'il faut crédité et un compte y qu'il faut débité alors que dans ma méthode virement on ne peut pas utiliser
compte.retrait(montant);
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
3 oct. 2016 à 20:15
Pour faire un virement il faut deux comptes : celui qui envoie l'argent et celui qui le reçoit.
Si tu fais
compte.depot(montant); compte.retrait(montant);
c'est le même compte qui fait le dépôt et le retrait, donc c'est le même solde qui est tour à tour augmenté et diminué du même montant, ce qui s'annule.

Si tu regardes mon code
this.debit(montant); destinataire.credit(montant);
tu as bien deux comptes,
this
qui est le compte courant, celui sur lequel tu appliques la méthode virement, qui va envoyer l'envoyer l'argent et voir son solde diminuer, et compte, que tu passes en paramètre, qui va recevoir l'argent et avoir son solde augmenté.

En gros si tu fais :
solde1.virement(solde2, montant)
cela va faire l'équivalent de
solde1.debit(montant); solde2.credit(montant);

PS. Pour les balises de codes, c'est <code java> ton code </code>
Et non pas <code java></code> ton code <code java></code> comme tu fais...
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
3 oct. 2016 à 20:41
Merci mais dans mon code suivant

public void virement( CompteEnBanque compte, double montant) {
compte.depot(montant);
.retrait(montant);
}

on est d'accord qu'on sait qu'il y'a un compte qui va recevoir l'argent puisque on utilise le compte passé en paramètre et on invoque la méthode dépôt mais dans la méthode retrait il n'est invoqué par rien il n'est précédé que d'un ". " du coup comment ma class Test peut savoir qu'il faut effectuer un retrait si ma méthode retrait n'est même pas invoqué par un paramètre et comment le Test peut savoir qu'il faut effectuer un retrait dans un compte différent du compte ou il y'a eu un dépôt.
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
3 oct. 2016 à 20:46
Déjà
.retrait(montant);
c'est faux, tu ne peux pas mettre
.
sans rien devant.

Donc soit tu fais
this.retrait(montant);
this
représente l'objet courant (c'est à dire l'objet sur lequel on applique la méthode), soit tu mets directement
retrait(montant);
et cela revient au même car
this
est implicite.
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
3 oct. 2016 à 20:57
Oui pardon je n'ai pas vérifié c'est bien retrait(montant); mais du coup lorsque je fait retrait(montant); mon programme considère il comme si cela représentait un objet courant ?
0