Page 1 sur 1

TP5 - Question 1 : pourquoi l'appel à this.contains est préféré à table.contains ? [Résolue]

Publié : 07 nov. 2018 15:49
par Massinissa
Bonjour à toutes et à tous,

La toute première question du TP5 demande d'implémenter la méthode add. En le faisant et après soumission j'ai eu en retour une erreur avec cette explication :
test_contains_dans_add(question1): L'appel à this.contains est préféré à table.contains (pourquoi ?)...
Effectivement, dans mon code j'utilise la méthode contains de Vector sur l'objet table au lieu de la méthode contains que Ensemble hérite de AbstractCollection. En parcourant la Javadoc je constate que Vector override cette méthode, même si il l'hérite lui aussi de AbstractCollection car il est une AbstractCollection.

En scrutant le comportement des 2 méthodes je constate - sauf erreur - qu'elles récupèrent le même Iterator ( celui de Vector dans les 2 cas ) et ensuite elles essayent de trouver dans table ou dans Ensemble un élément e qui vérifie : (o==null ? e==null : o.equals(e)) auquel cas elles renvoient true, false autrement.On aboutit à la même méthode equals, celle de l'objet o.

Sauf erreur de ma part - ce qui est sûrement le cas :-) -, les 2 méthodes sont identiques.
Alors selon vous, pourquoi this.contains est préférable à table.contains ?

Merci par avance pour vos réponses.

Re: TP5 - Question 1 : pourquoi l'appel à this.contains est préféré à table.contains ?

Publié : 07 nov. 2018 22:04
par RENAUD
alors j'ai entendu souvent que c'était parce que il retournait un booleen ! comme pour add()
mais pour moi c'est surtout parceque la classe implémente iterator() pour la liste et qu'à la différence pour add() qui modifie ce qui ferait boucler sur this.add() par appel récursif de l'appelant sur iterator,
contains quant à lui est en "consultation" en lecture mais il est logique d'utiliser this (toujours iterator !) vu que c'est lui qui est appelé qui parcourt la liste ou le tableau !

mais c'est que mon avis

Re: TP5 - Question 1 : pourquoi l'appel à this.contains est préféré à table.contains ?

Publié : 08 nov. 2018 0:51
par Massinissa
Rebonjour,

@Renaud,
Merci pour la réponse, néanmoins j'ai du mal à voir la raison de cette préférence dans celle-ci.

Pour illustrer la question et la rendre plus concrète, voici 2 implémentations complètement fonctionnelles de add() :

Implé. 1 :

Code : Tout sélectionner

public boolean add(T t) {
        if (!  this.contains(t) ) {
            return table.add(t);
        }
        return false; 
}
Implé. 2 :

Code : Tout sélectionner

public boolean add(T t) {
        if (!  table.contains(t) ) {
            return table.add(t);
        }
        return false; 
}
L'unique différence est : if (! this.contains(t) ) ... VS if (! table.contains(t) )...

Question :
Pourquoi l'implémentation 1 est préférée ( dixit JNEWS ) ?


Merci encore pour vos réponses.

Re: TP5 - Question 1 : pourquoi l'appel à this.contains est préféré à table.contains ?

Publié : 08 nov. 2018 2:21
par RENAUD
Si j'ai raison sur iterator() et si je suis mon idée, c'est normal que le test de jnews se base sur this (qui est la classe qui implémente iterator() pour la table si je ne me trompe pas).
Même si table est correct, c'est bien iterator qui parcourt table pour voir si t est contenu dedans d'où this.
Par contre si tu fais ça pour add() tu tente de modifier pendant l'appel à iterator retour du resultat de add sur iterator qui ne peut donc pas terminer et recommence "sans fin" add()... enfin je crois que c'est ça qu'il se passe!
Bref moi aussi j'aimerais être sur même si c'est ce que j'ai mis comme explication :/

Re: TP5 - Question 1 : pourquoi l'appel à this.contains est préféré à table.contains ?

Publié : 08 nov. 2018 10:11
par Douin
Bonjour,

Ce n'est pas lié à une implémentation mais au patron template method ou encore la réponse à une question du type:

<< si je dois changer l'implementation de mon ensemble, substituer Vector par une autre classe, quelles sont les lignes de sources java à modifier ? >>

Vous avez la réponse, moins de ligne à changer, plus le patron template method fournit un couplage faible de "mon logiciel", il est donc préférable d'utiliser this.contains plutôt que de "cabler" add à contains de la classe Vector

Bonne fin de tp

Re: TP5 - Question 1 : pourquoi l'appel à this.contains est préféré à table.contains ?

Publié : 08 nov. 2018 14:20
par RENAUD
ok... est-ce que cette raison en va de même pour add() ?
la question et le fait que ça boucle infini pour add() m'a influencé pour les deux methodes vector.
pourtant j'avais tendance déjà, comme tout le monde j'imagine, à mettre this si dans une seule méthode il y'a un paramètre et un attribut privé de la class. d'ailleurs le premier reflexe a été de mettre this aussi pour add() avant de changer puisque ça bouclait.