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

Programmation Avancée

Modérateur : Douin

Massinissa
Messages : 6
Inscription : 25 oct. 2018 12:02

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

Message par Massinissa » 07 nov. 2018 15:49

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.
Dernière édition par Massinissa le 09 nov. 2018 15:05, édité 1 fois.

RENAUD
Messages : 72
Inscription : 21 sept. 2018 19:34

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

Message par RENAUD » 07 nov. 2018 22:04

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

Massinissa
Messages : 6
Inscription : 25 oct. 2018 12:02

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

Message par Massinissa » 08 nov. 2018 0:51

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.

RENAUD
Messages : 72
Inscription : 21 sept. 2018 19:34

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

Message par RENAUD » 08 nov. 2018 2:21

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 :/

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

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

Message par Douin » 08 nov. 2018 10:11

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

RENAUD
Messages : 72
Inscription : 21 sept. 2018 19:34

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

Message par RENAUD » 08 nov. 2018 14:20

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.

Répondre

Qui est en ligne ?

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