Page 1 sur 1

tp commit question 3

Publié : 03 déc. 2017 18:10
par pthellier
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 ?

Re: tp commit question 3

Publié : 03 déc. 2017 20:32
par douinj
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...

Re: tp commit question 3

Publié : 03 déc. 2017 20:39
par bcalendreau
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.

Re: tp commit question 3

Publié : 04 déc. 2017 19:22
par slash
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 ?

Re: tp commit question 3

Publié : 04 déc. 2017 21:32
par pthellier
Il y a ambiguïté pour moi c'est getstae qui devrait être utilisé en retournant un cotisant.

Re: tp commit question 3

Publié : 04 déc. 2017 22:18
par slash
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

Re: tp commit question 3

Publié : 04 déc. 2017 22:27
par _mat_
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.

Re: tp commit question 3

Publié : 04 déc. 2017 23:49
par slash
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 ?

Re: tp commit question 3

Publié : 05 déc. 2017 0:11
par _mat_
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.

Re: tp commit question 3

Publié : 05 déc. 2017 0:40
par _mat_
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()).

Re: tp commit question 3

Publié : 05 déc. 2017 14:30
par slash
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.

Re: tp commit question 3

Publié : 05 déc. 2017 17:32
par douinj
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

Re: tp commit question 3

Publié : 06 déc. 2017 1:37
par slash
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.