TP commit question2 tests composite cyclique

Programmation Avancée

Moderator: douinj

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

TP commit question2 tests composite cyclique

Post by marti_r1 » 01 Dec 2021 14:45

Bonjour,
J'en suis à cette question :

public void testCompositeCyclique(){
try{
GroupeDeContributeurs g=new GroupeDeContributeurs("g");
g.ajouter(new Contributeur("g_a",100));
g.ajouter(g);
assertFalse("Ce composite n'est pas valide, revoyez CompositeValide !!!",g.accepter(new CompositeValide(100)));
}catch(StackOverflowError soe){
fail("exception: appel récursif sans terminaison, le composite testé est cyclique");
}catch(Throwable e){
fail("exception inattendue !!!"+e.getMessage());
}
}

C'est une récursion sans fin donc ça va générer une StackOverflowError, récupérée dans le premier catch, s'affiche :"exception : appel récursif..."
Et ça ne passe donc pas sur la ligne : assertFalse("Ce composite n'est pas valide, revoyez CompositeValide !!!",g.accepter(new CompositeValide(100)));
Donc je ne peux pas tester le visiteur qui valide.
J'ai essayé de modifier la méthode ajouter de GroupeDeContributeurs :

public void ajouter(Cotisant cotisant) throws StackOverflowError{
assert cotisant!=null && cotisant.getParent()==null;
if(cotisant instanceof GroupeDeContributeurs){
if(cotisant==this){
throw new StackOverflowError();
}
if(this.getParent()==cotisant){
throw new StackOverflowError();
}
}
try{
liste.add(cotisant);
cotisant.setParent(this);
}catch(StackOverflowError soe){
}
}

Mais rien n'y fait, je n'ai pas du bien comprendre le mécanisme des gestion des erreurs ?
Je tente la question 3.
Cordialement.

douinj
Posts: 462
Joined: 18 Mar 2009 15:46

Re: TP commit question2 tests composite cyclique

Post by douinj » 01 Dec 2021 15:15

Bonjour,
Attention Et ça ne passe donc pas sur la ligne : assertFalse("Ce composite n'est pas valide, revoyez CompositeValide !!!",g.accepter(new CompositeValide(100)));
C'est bien g.accepter(new CompositeValide(100) qui lève cette exception

à suivre

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

Re: TP commit question2 tests composite cyclique

Post by marti_r1 » 01 Dec 2021 17:08

Merci pour la réponse mais bon... je "sature".
Je vois à peu près le patron Memento puisque j'ai réussi à le faire dans le TP précédent, idem pour le patron visiteur que j'ai "réussi" dans le TP précédent mais là tout "s'embrouille" ici.
J'ai beau lire le TD, lire et relire le poly de cours, je vois bien que ça "tourne vraiment autour" entre poly de cours et TP avec NotePadComponent=Cotisant, NotePad=Contributeur, NotePadComposite=GroupeDeContributeurs, p77, le visiteur qui retourne des copies d'un NotePad et d'un NotePadComposite mais...
J'ai tout essayé hier des copies de liste des GroupeDeContributeurs, des opération de récupération de soldes avec solde(), des modifications de soldes avec retrait() et credit() etc, etc...
J'ai tous les éléments sous les yeux et je n'arrive pas à assembler les pièces du puzzle, je crois qu'au delà de la note, dont je me soucis assez peu sur le fond, c'est le caractère extrêmement frustrant et le sentiment d'être "demeuré".
Pas grave, j'ai cherché au moins et c'est ça qui me fait comprendre et que j’apprécie par dessus tout, je regarderai la correction calmement pour retravailler cela, correctement.
Merci pour les "indications" sur le forum, en tout cas.
Cordialement

delaba_q
Posts: 26
Joined: 03 Oct 2021 0:47

Re: TP commit question2 tests composite cyclique

Post by delaba_q » 03 Dec 2021 10:23

Pour détecter les erreurs de dépendance cyclique, je n'ai jamais trouvé de solution parfaite, ça dépend du contexte, et je trouve que ce n'est pas un problème simple.

La solution que j'ai mis en oeuvre s'appuie sur des propriétés du visiteur, pour conserver une trace des contributeurs visités, et détecter si l'un d'eux a déjà été visité (+ du code pour réinitialiser ces états, un peu compliqué à appréhender).
Une solution beaucoup plus simple que j'ai essayé lors de ma recherche... C'est un try/catch sur StackOverflowError dans le visiteur :) C'est pas très propre, mais ça a le mérite d'être court, rapide à comprendre, et efficace.

Post Reply