TP-Commit question 3, ribambelle de questions !!!

Programmation Avancée

Moderator: douinj

Post Reply
marti_r1
Posts: 66
Joined: 07 Oct 2021 20:16

TP-Commit question 3, ribambelle de questions !!!

Post by marti_r1 » 30 Nov 2021 17:47

Je crois que j'ai "un peu" tout essayer sauf peut être de finir de lire le cours et regarder le TD :-(
Bref, voila ce que j'essaye, je dis bien essaye, intellectuellement de faire.
La seule chose à laquelle on peut avoir accès c'est les soldes avec la méthode solde(), une sorte de "getSolde()" et on peut aussi les modifier avec debit() ou credit(), sortes de "setSolde()".
La liste du GroupeDeContributeurs étant seulement accessible avec getChildren() et non modifiable car pas de sorte de "setListe()".
Donc j'essaye de copier la liste du Cotisant c passé en paramètre du constructeur de Memento.
Déja je fais un micmac de "cast" avec (GroupeDeContributeurs)c et ça suppose que c déclaré Cotisant ne peut être que constaté GroupeDeContributeurs et non Contributeur !
Et c'est déjà là que ça se "gâte", j'ai fait des tests avec une classe de tests perso et des System.out.println() (je fais avec mon niveau) et j'ai à chaque fois l'impression que quand je copie la la liste du Cotisant c dans ma listeMemento et que je modifie après la liste du Cotisant c avec un credit() ou débit() par exemple et bien listeMemento est modifiée de la même façon !
J'ai essayé avec addAll(), comme indiqué ci-dessous élément par élément, comme dans le cours avec listeMemento=new ArrayList<Cotisant>(((GroupeDeContributeurs)c).getChildren()), avec clone() sur laquelle je me suis risqué sur internet mais je n'y arrive pas à l'utiliser, du coup par la suite tout "tombe à l'eau" !

public class Memento{

private List<Cotisant> listeMemento;

public Memento(Cotisant c){
assert c!=null;
List<Cotisant> liste=new ArrayList<Cotisant>();
for(Cotisant element : ((GroupeDeContributeurs)c).getChildren()){
liste.add(element);
}
}

public List<Cotisant> getListeMemento(){
return listeMemento;
}

public void setState(Cotisant c){
assert c!=null;
//((GroupeDeContributeurs)c).liste=listeMemento;
}

Mon idée par la suite c'est de stocker ce Memento avec sa copie de liste de c dans la pile du gardien avec dans beginTransaction() : gardien.setMemento(new Memento(cotisant)).
Ainsi si dans le groupe g : "a",100, "b",50 et "c",150, ceci est sauvegardé dans le memento après un premier retrait de 10, "a",90, "b",40 et "c",140 , ceci est sauvegardé dans le memento puis après un retrait de 60, "a",30, "b",40 et "c",140, le retrait s'est effectué sur a mais a bloqué en b en levant une exception et du coup s'est pas fait sur c.
Du coup un iterateur est mis sur la liste extraite du memento qui vient d'être dépilé à savoir : "a",90, "b",40 et "c",140 avant le "retrait bloquant" et un itérateur est mis sur la liste actuelle, celle de c, à savoir : a",30, "b",40 et "c",140, après le retrait bloquant.
Les deux listes ayant la même taille, chacune est itérée en parallèle et on compare.
Sur la liste avant retrait bloquant (celle extraite du memento), le solde de a c'est 90, sur celle après retrait bloquant, le solde de a c'est 30.
Ils sont différents, on crédite le solde de a sur la liste après retrait bloquant de 90-30 soit 60, avec la méthode credit().
En gros a dans c (GroupeDeContributeurs) a maintenant un solde de nouveau de 90.
Pour b et c comme leurs soldes respectifs avant et après retrait bloquant sont les mêmes, on ne fait rien.
Et ben ça marche pas !!!

public class TransactionDebit extends AbstractTransaction{

private Gardien gardien;

public TransactionDebit(Cotisant cotisant){
super(cotisant);
this.gardien=new Gardien();
}

public void beginTransaction(){
gardien.setMemento(new Memento(cotisant));
}

public void endTransaction(){
}

public void rollbackTransaction(){
Iterator<Cotisant> iterateurEtatFinal=((GroupeDeContributeurs)cotisant).iterator();
Iterator<Cotisant> iterateurEtatInitial=(gardien.getMemento()).getListeMemento().iterator();
int valInitiale, valFinale;
while(iterateurEtatFinal.hasNext()&&iterateurEtatInitial.hasNext()){
if(iterateurEtatFinal.next().solde()<iterateurEtatInitial.next().solde()){
valInitiale=iterateurEtatInitial.next().solde();
valFinale=iterateurEtatFinal.next().solde();
iterateurEtatFinal.next().credit(valInitiale-valFinale);

//iterateurEtatFinal.next().credit((iterateurEtatInitial.next().solde())-(iterateurEtatFinal.next().solde()));
}
}
}
}

Du coup plusieurs questions :

- Je ne comprends pas à quoi sert endTransaction(), dans le cours il est indiqué : "fin normale" ?
- Je ne comprends pas l'idée de solution avec les visiteurs ?
- Je ne comprends pas avec, mon raisonnement, l'utilisation et l'utilité de la methode setState(Cotisant c) de memento ?

Bref je comprends rien, alors je vais relire le cours moins "en diagonale" cette fois-ci !
Cordialement

Post Reply