Iterator

Denne artikel kan indeholde upubliceret arbejde eller ubekræftede udsagn (oktober 2014).

Du kan hjælpe ved at tilføje referencer eller fjerne ikke-offentliggjort indhold. Se diskussionssiden for flere detaljer.

I softwareudvikling , den iterator er et design mønster (design mønster) adfærd .

En iterator er et objekt, der giver dig mulighed for at gennemse alle elementerne i et andet objekt, oftest en container ( liste , træ osv.). Et synonym for iterator er markør , især i forbindelse med databaser .

Beskrivelse

En iterator ligner en markør med i det væsentlige to primitiver: adgang til det aktuelle spidse element (i beholderen) og bevæger sig for at pege på det næste element. Derudover er det nødvendigt at være i stand til at oprette en iterator, der peger på det første element; samt til enhver tid at bestemme, om iteratoren har udtømt alle elementerne i containeren. Forskellige implementeringer kan også tilbyde yderligere adfærd.

Formålet med en iterator er at give brugeren mulighed for at gennemse containeren, det vil sige sekventielt få adgang til alle dens elementer for at anvende behandling på dem, samtidig med at brugeren isoleres fra beholderens interne struktur., Potentielt kompleks. Så beholderen kan gemme de emner, som de vil, men samtidig give brugeren mulighed for at behandle det som en simpel liste. Oftest er iteratoren designet på samme tid som containerklassen, som den skal gennemse, og det er selve containeren, der opretter og distribuerer iteratorerne for at få adgang til dens elementer.

Forskelle med indeksering

proceduremæssige sprog bruges et indeks ofte i en simpel sløjfe til sekventiel adgang til alle elementerne, især en matrix. Selv om denne tilgang stadig er mulig i objektprogrammering for nogle containere, har brugen af iteratorer visse fordele:

Muligheden for, at en container kan modificeres under en iteration, er blevet nødvendig i moderne objektprogrammering , hvor forholdet mellem objekter og effekten af ​​visse operationer kan blive hovedpine. Ved at bruge en sådan "robust" iterator spares vi for disse ulemper.

Brug af en eksplicit iterator

I et objektorienteret sprog som C # er en iterator et objekt, der implementerer grænsefladen IEnumerator.

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

Vi bruger iteratoren til at få adgang til de tilgængelige værdier.

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

En af de mange mulige objektimplementeringer kan se sådan ud.

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]; } } }

IEnumerableC # interface giver mulighed for at skifte til en implicit iterator.

interface IEnumerable { IEnumerator GetEnumerator(); }

C # -arrays, lister eller ordbøger er typer afledt af IEnumerableog har en metode, GetEnumerator()der kalder den eksplicitte iterator.

C # 's foreach-erklæring kalder denne metode GetEnumerator()og gentages eksplicit mens den skjuler detaljerne i implementeringen.

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

Implicitte iteratorer

Objektorienterede sprog som Perl og Python giver en "intern" måde at gentage elementerne i en container uden eksplicit at introducere en iterator. Dette implementeres ofte af en for hver kontrolstruktur , som i de følgende eksempler:

# 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

Opmærksomhed, i Javascript gentager vi ikke direkte på objekterne, men på deres navn

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

C ++ - sproget har også skabelonfunktionen, std::for_each()der tillader lignende implicitte iterationer, men kræver stadig at give iteratorobjekter som inputparametre.

Bemærk  : Ruby, Python og C # fra sin version 2.0 tilbyder via yieldet specifikt værktøj til at opbygge iteratorer.

PHP- sproget har implementeret iteratorer siden version 5 via SPL .