Itérateur (Motif de conception)

Itérateur (Motif de conception)

Itérateur (patron de conception)

En génie logiciel, l'itérateur est un patron de conception (design pattern) comportemental.

Un itérateur est un objet qui permet de parcourir tous les éléments contenus dans un autre objet, le plus souvent un conteneur (liste, arbre, etc). Un synonyme d'itérateur est curseur, notamment dans le contexte des bases de données.

Sommaire

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.

Différences avec l'indexation

Dans les langages procéduraux on utilise souvent un index dans une simple boucle, pour accéder séquentiellement à tous les éléments, notamment d'un tableau. Quoique cette approche reste possible en programmation objet pour certains conteneurs, l'utilisation des itérateurs a certains avantages:

  • Un simple compteur dans une boucle n'est pas adapté à toutes les structures de données, en particulier
    • celles qui n'ont pas de méthode d'accès à un élément quelconque
    • celles dont l'accès à un élément quelconque est très lent (c'est le cas des listes chaînées et des arbres).
  • 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.
    Important : il est indispensable de bien consulter la documentation d'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.

Utilisation d'un itérateur explicite

Dans un langage à objets comme le C#, un itérateur est un objet qui implémente l'interface IEnumerator.

interface IEnumerator {
    void Reset();
    bool MoveNext();
    object Current { get; }
}

On utilise l'iterateur pour accéder aux valeurs disponibles.

    IterateurTypique iterateur = new IterateurTypique ();
 
    iterateur.Reset(); // optionnel : cet appel peut ne pas être effectué.
    while(iterateur.MoveNext()){
        Console.WriteLine(iterateur.Current);
    }

Une des nombreuses implémentations de l'objet possibles peut ressembler à celle-ci.

class IterateurTypique : IEnumerator {
 
    private string[] _chainesAParcourir = new string[] { "TF1", "France2", "FR3", "Canal+" };
    private int _positionCourante = -1;
 
    public void Reset() { _positionCourante = -1; }
    public bool MoveNext() {
        if( _positionCourante + 1 >= _chainesAParcourir.Length ) return false; 
 
        _positionCourante +=1; 
        return true;
    }
    public object Current { get { return _chainesAParcourir[_positionCourante]; } }
}

L'interface IEnumerable de C# permet le passage à un itérateur implicite.

interface IEnumerable {
    IEnumerator GetEnumerator();
}

les tableaux, listes ou dictionnaires de C# sont des types dérivés de IEnumerable et possèdent une méthode GetEnumerator() qui appelle l'itérateur explicite.

l'instruction foreach du C# appelle cette méthode GetEnumerator() et procède à une itération explicite tout en cachant les détails de l'implémentation.

if(Television is IEnumerable) {
    foreach(object chaine in Television) {
        Console.WriteLine(chaine);
    }
}

Itérateurs implicites

Des langages à objets comme Perl et 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 :

    # Tcl: itérateur implicite
    foreach val $list {
        puts stdout $val
    }
    # Perl: itérateur implicite
    foreach $val (@list) {
        print "$val\n";
    }
    # Python, itérateur implicite
    for Value in List:
        print Value
    // PHP, itérateur implicite
    foreach ($list as $value)
        print $value;
    // Java, J2SE 5.0, itérateur implicite
    for (Value v : list)
        System.out.print(v);
    // C#, itérateur implicite
    foreach (object obj in list)
        Console.WriteLine(obj );
 
    // C#, itérateur explicite avec un yield
    foreach (object obj in IndicesPairs() )
        Console.WriteLine(obj); 
 
    // ou IndicesPairs() est une méthode
    IEnumerable IndicesPairs() {
        for(int i=0; i<tableau.Length; i++)
            if(i%2==0) 
                yield return tableau[i];
    }
  # Ruby, itérateur de bloc, (yield)
      list.each do |value|
         puts value
      end
  # ou each est une méthode de Array tel que :
      def each
         for i in 0...size
            yield(self[i])
         end
      end

Attention, en Javascript, on itère pas directement sur les objets mais sur leur nom

    // Javascript, itérateur implicite
    for(nom in Object) {
        var valeur =  Object[nom];
        alert(Value+" = "+valeur ]);
    }

Le langage C++ dispose également de la fonction template std::for_each() qui permet des itérations implicites similaires, mais requiert toujours de fournir des objets itérateurs en paramètres d'entrée.

Remarque : le Ruby (ainsi que le C# à partir de sa version 2.0), offre via yield un outil spécifique pour construire des itérateurs.

  • Portail de l’informatique Portail de l’informatique
Ce document provient de « It%C3%A9rateur (patron de conception) ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Itérateur (Motif de conception) de Wikipédia en français (auteurs)

Игры ⚽ Поможем сделать НИР

Regardez d'autres dictionnaires:

  • Itérateur (motif de conception) — Itérateur (patron de conception) En génie logiciel, l itérateur est un patron de conception (design pattern) comportemental. Un itérateur est un objet qui permet de parcourir tous les éléments contenus dans un autre objet, le plus souvent un… …   Wikipédia en Français

  • Motif de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Observateur (Motif de conception) — Observateur (patron de conception) Le patron de conception observateur/observable est utilisé en programmation pour envoyer un signal à des modules qui jouent le rôle d observateur. En cas de notification, les observateurs effectuent alors l… …   Wikipédia en Français

  • Observateur (motif de conception) — Observateur (patron de conception) Le patron de conception observateur/observable est utilisé en programmation pour envoyer un signal à des modules qui jouent le rôle d observateur. En cas de notification, les observateurs effectuent alors l… …   Wikipédia en Français

  • Modèle de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Modèles de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Motifs de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Patrons de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Schéma de conception — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

  • Design Pattern — Patron de conception Pour les articles homonymes, voir Patron. Un patron de conception (design pattern en anglais) est un concept de génie logiciel destiné à résoudre les problèmes récurrents suivant le paradigme objet. En français on utilise… …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”