« Patrons de conception/Itérateur » : différence entre les versions

Contenu supprimé Contenu ajouté
imported>AlleborgoBot
m robot Modifie: it:Iterator pattern
Chtfn (discussion | contributions)
espace avant double ponctuation, guillemets français, style
Ligne 5 :
== Description ==
 
Un itérateur ressemble à un [[pointeur]] disposant essentiellement de deux primitives : ''accéder'' à l'élément pointé en cours (dans le conteneur), et ''se déplacer'' pour pointer vers l'élément suivant. En sus, il faut pouvoir créer un itérateur pointant sur le premier élément ; ainsi que déterminer à tout moment si l'itérateur a épuisé la totalité des éléments du conteneur. Diverses implémentations peuvent également offrir des comportements supplémentaires.
 
Le but d'un itérateur est de permettre à son utilisateur de ''parcourir'' le conteneur, c'est-à-dire d'accéder séquentiellement à tous ses éléments pour leur appliquer un traitement, tout en isolant l'utilisateur de la structure interne du conteneur, potentiellement complexe. Ainsi, le conteneur peut stocker les éléments de la façon qu'il veut, tout en permettant à l'utilisateur de le traiter comme une simple liste. Le plus souvent l'itérateur est conçu en même temps que la classe-conteneur qu'il devra parcourir, et ce sera le conteneur lui-même qui créera et distribuera les itérateurs pour accéder à ses éléments.
Ligne 17 :
* Les itérateurs fournissent un moyen cohérent d'''itérer'' sur toutes sortes de structures de données, rendant ainsi le code client plus lisible, réutilisable, et robuste même en cas de changement dans l'organisation de la structure de données.
* Un itérateur peut implanter des restrictions additionnelles sur l'accès aux éléments, par exemple pour empêcher qu'un élément soit « sauté », ou qu'un même élément soit visité deux fois.
* Un itérateur peut ''dans certains cas'' permettre que le conteneur soit modifié, sans être invalidé pour autant. Par exemple, après qu'un itérateur s'est positionné derrière le premier élément, il est possible d'insérer d'autres éléments au début du conteneur avec des résultats prévisibles. Avec un index on aurait plus de problèmes, parce que la valeur de l'index devrait elle aussi être modifiée en conséquence.<br/>'''Important :''' consultezil est indispensable de bien consulter la documentation de votred'un itérateur pour savoir dans quels cas il est invalidé ou non!.
 
La possibilité pour un conteneur de se voir modifié pendant une itération s'est imposée comme nécessaire dans la [[programmation objet]] moderne, où les relations entre objets et l'effet de certaines opérations peut devenir un casse-tête. En utilisant un tel itérateur "« robuste" », ces désagréments nous sont épargnés.
 
== Itérateurs implicites ==
 
Des langages à objets comme [[Perl (langage)|Perl]] et [[Python (langage)|Python]] fournissent un moyen « interne » d'itérer sur les éléments d'un conteneur sans introduire explicitement un itérateur. Cela est souvent implanté par une structure de contrôle ''for-each'', comme dans les exemples suivants :
 
<source lang="perl">