tp commit question 3

Programmation Avancée

Modérateur : Douin

Répondre
pthellier
Messages : 24
Inscription : 10 oct. 2017 13:52

tp commit question 3

Message par pthellier » 03 déc. 2017 18:10

Bonjour

Quand on examine la classe AbstractTransaction,on constate que que cotisant est protected, donc les modifications de c exécutées par memento.setstate(memento c) pour restituer un état sont inaccessible.

Comment faire ?

Douin
Messages : 201
Inscription : 18 mars 2009 15:46

Re: tp commit question 3

Message par Douin » 03 déc. 2017 20:32

Bonjour,
Je ne sais si cela peut vous aider mais un champ "protected" est accessible par les classes filles quelque soit les paquetages et par toutes les classes dans le paquetage en cours
à suivre...

bcalendreau
Messages : 23
Inscription : 07 oct. 2017 20:27

Re: tp commit question 3

Message par bcalendreau » 03 déc. 2017 20:39

Moi j'ai quelque chose de nouveau, j'échoue à un test de la classe test (testDebitEnErreur) mais je passe sans faute les tests jnews sensés être plus poussés pour cette question 3, comme quoi. (D'ailleurs je ne m'explique pas encore l'erreur, sachant qu'il me semble que ce test ne fait pas appel aux nouvelles méthodes de la question 3... L'erreur serait donc de ne pas traiter les débits de la bonne manière en question 1 où j'ai pourtant tout validé proprement ?).

Sinon pour répondre au premier post, j'ai suivi le conseil qui indique de créer deux visiteurs, un pour la sauvegarde et un pour la restauration.

slash
Messages : 15
Inscription : 04 nov. 2017 2:45

Re: tp commit question 3

Message par slash » 04 déc. 2017 19:22

Bonjour,

J'ai vraiment un problème avec la mise à jour du Cotisant de TransactionDebit.

Dans la méthode setState de Memento, j'arrive bien à affecter le Cotisant issu du Memento au Cotisant passé en paramètre (qui est censé être celui de TransactionDebit), mais à la sortie du rollbackTransaction, c'est comme si cette affectation n'avait pas eu lieu...

J'ai bien utilisé un visiteur pour ramener une nouvelle version de Cotisant pour la sauvegarde dans Memento, mais je ne vois pas comment ni pourquoi utiliser un visiteur pour la restauration.

En résumé, pourquoi cette simple affectation ne fonctionne-t-elle pas (à part dans la classe Memento)?

Code : Tout sélectionner

public void setState(Cotisant c) {
        // restitution
        c = this.cot;
}
Est-ce uniquement parce que la variable c est protected ?

pthellier
Messages : 24
Inscription : 10 oct. 2017 13:52

Re: tp commit question 3

Message par pthellier » 04 déc. 2017 21:32

Il y a ambiguïté pour moi c'est getstae qui devrait être utilisé en retournant un cotisant.

slash
Messages : 15
Inscription : 04 nov. 2017 2:45

Re: tp commit question 3

Message par slash » 04 déc. 2017 22:18

En fait j'avais gardé la signature d'origine de la méthode du TP :

Code : Tout sélectionner

public void setState(Cotisant c) {
       // restitution
     }
Je pensais donc qu'on pouvait (et surtout qu'il fallait) affecter à la variable c le cotisant stocké dans Memento, afin de le restituer.
Mais apparemment il y a soucis. J'ai essayé aussi de faire une méthode getState qui renvoie le Cotisant mémorisé, mais il n'y a rien à faire.
J'ai même essayé de renvoyé directement dans rollbackTransaction un nouveau Contributeur bidon, pour voir si dans la classe de test (dans testDebitAvecTransaction) je le récupérais bien. Et bien non, la méthode g.solde() me renvoie le résultat du solde de c (modifié par débit) et pas le cotisant de TransactionDebit.

Je pense donc que je fais complètement fausse route. Il y a certainement une visite à faire du Cotisant de TransactionDebit passé en paramètre dans setState, afin de le reconstruire, et non d'en renvoyer un autre. Je vais essayer quelque chose dans le genre...

Merci

_mat_
Messages : 7
Inscription : 05 nov. 2017 11:51

Re: tp commit question 3

Message par _mat_ » 04 déc. 2017 22:27

Bonsoir,
Si ça peut vous aider, j'ai réussi à mettre à jour "Cotisant c" de la méthode setState() en utilisant la méthode affecterSolde() de la classe Contibuteur.

slash
Messages : 15
Inscription : 04 nov. 2017 2:45

Re: tp commit question 3

Message par slash » 04 déc. 2017 23:49

Merci Mat,

Effectivement ça a l'air d'être la bonne solution, mais j'ai quand même l'impression de m'emmêler les pinceaux :
Le visiteur à utiliser dans la méthode setState() doit-il servir à retourner le solde de chaque cotisant visité ? Auquel cas la méthode affecterSolde() est bien à utiliser dans la méthode setState(), pas dans le visiteur ?

_mat_
Messages : 7
Inscription : 05 nov. 2017 11:51

Re: tp commit question 3

Message par _mat_ » 05 déc. 2017 0:11

Le premier visiteur sert à sauvegarder un Cotisant ==> donc tu dois avoir des new contributeur() et des new GroupeDeContibuteurs().
Le second visiteur doit mettre à jour le Cotisant courant avec le cotisant sauvegardé dans le memento ==> tu utilises donc le cotisant sauvegardé pour mettre à jour le cotisant courant.

_mat_
Messages : 7
Inscription : 05 nov. 2017 11:51

Re: tp commit question 3

Message par _mat_ » 05 déc. 2017 0:40

Le second visiteur doit mettre à jour le Cotisant courant avec le cotisant sauvegardé dans le memento ==> tu utilises donc le cotisant sauvegardé (variable de la classe Memento) pour mettre à jour le cotisant courant (affecterSolde()).

slash
Messages : 15
Inscription : 04 nov. 2017 2:45

Re: tp commit question 3

Message par slash » 05 déc. 2017 14:30

Merci pour ta réponse.

Pour le premier visiteur, je n'ai pas eu de problème particulier. Par contre pour le deuxième, j'ai un doute. La méthode affecterSolde() doit prendre en paramètre le solde d'un des contributeurs inclus dans le Cotisant du Memento, or celui-ci n'est pas accessible dans le visiteur. J'en déduit que le visiteur sert simplement à "savoir" si on a affaire à un Contributeur ou à un GroupeDeContributeurs lorsqu'on parcourt le Cotisant (ainsi on évite d'utiliser instanceof), et la méthode affecterSolde() est bien à utiliser dans Memento.

Avec cette solution j'arrive à avancer un peu, mais j'ai encore des erreurs dans testTransactionDebitSure5() et testDebitAvecTransaction2(). Je continue de chercher.

Douin
Messages : 201
Inscription : 18 mars 2009 15:46

Re: tp commit question 3

Message par Douin » 05 déc. 2017 17:32

Bonjour,

en Hypothèse nous n'avons pas d''homonyme pour les noms des contributeurs

La classe memento pourrait contenir une Map<Cotisant,Integer> renseignée lors de la sauvegarde par un visiteur et cette "Map" permettrait de restituer les bonnes valeurs des noeuds du composite avec un second visiteur

Bonne fin de tp

slash
Messages : 15
Inscription : 04 nov. 2017 2:45

Re: tp commit question 3

Message par slash » 06 déc. 2017 1:37

Bonsoir,

Merci Mr Douin, j'ai lu un peu trop tard votre message, j'ai essayé de faire au mieux autrement comme j'ai pu.
Les résultats sont corrects mise à part une erreur JNews pour la question4 et que j'arrive pas à reproduire en local, je ne sais pas pourquoi.

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité