Iterátor

Ez a cikk publikálhatatlan munkákat vagy nem ellenőrzött nyilatkozatokat tartalmazhat (2014. október).

Segíthet referenciák hozzáadásával vagy a közzé nem tett tartalom eltávolításával. További részletekért lásd a beszélgetés oldalt .

A szoftverfejlesztésben az iterátor egy tervezési minta (tervezési minta) viselkedés .

Az iterátor olyan objektum, amely lehetővé teszi egy másik objektum összes elemének böngészését, leggyakrabban egy tárolót ( lista , fa stb.). Az iterátor szinonimája a kurzor , különösen az adatbázisok összefüggésében .

Leírás

Egy bejáró néz ki, mint egy mutató , amely lényegében két primitívek: betekintés a jelenlegi hegyes elem (a tartályban), és a mozgó pont a következő elem. Ezenkívül képesnek kell lennie az első elemre mutató iterátor létrehozására; valamint bármikor meghatározni, hogy az iterátor kimerítette-e a tartály összes elemét. A különféle megvalósítások további magatartást is kínálhatnak.

Az iterátor célja, hogy lehetővé tegye a felhasználó számára, hogy böngészjen a tárolóban, vagyis szekvenciálisan hozzáférjen az összes eleméhez, hogy feldolgozást alkalmazzon rájuk, miközben elkülöníti a felhasználót a tároló belső szerkezetétől., Potenciálisan összetett. Tehát a tároló tárolhatja az elemeket, ahogyan akarja, miközben továbbra is lehetővé teszi a felhasználó számára, hogy egyszerű listaként kezelje azokat. Legtöbbször az iterátort egyidejűleg tervezik meg a tárolóosztályral, amelyet böngésznie kell, és maga a tároló fogja létrehozni és terjeszteni az iterátorokat az elemei eléréséhez.

Különbségek az indexeléssel

Az eljárási nyelvekben az indexet gyakran egy egyszerű ciklusban használják , hogy egymás után hozzáférjenek az összes elemhez, különösen egy tömbhöz. Bár ez a megközelítés még lehetséges az objektumok programozásában egyes konténereknél, az iterátorok használatának bizonyos előnyei vannak:

A modern objektumprogramozás során szükségessé vált egy konténer módosítása egy iteráció során , ahol az objektumok közötti kapcsolatok és bizonyos műveletek hatása fejfájássá válhat. Egy ilyen "robusztus" iterátor használatával megkíméljük ezeket a kellemetlenségeket.

Kifejezett iterátor használata

Az olyan objektumorientált nyelvben, mint a C #, az iterátor olyan objektum, amely megvalósítja az interfészt IEnumerator.

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

Az iterátort használjuk az elérhető értékek eléréséhez.

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

A sok lehetséges objektum-megvalósítás egyike így nézhet ki.

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

A IEnumerableC # interfész lehetővé teszi az áttérést egy implicit iterátorra.

interface IEnumerable { IEnumerator GetEnumerator(); }

A C # tömbök, listák vagy szótárak olyan típusok, amelyek származnak, IEnumerableés rendelkeznek olyan módszerrel, GetEnumerator()amely az explicit iterátort hívja meg.

A C # foreach nyilatkozata ezt a módszert hívja meg, GetEnumerator()és kifejezetten iterál, miközben elrejti a megvalósítás részleteit.

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

Implicit iterátorok

Az olyan objektumorientált nyelvek, mint a Perl és a Python , "belső" módot kínálnak a konténer elemeinek ismétlésére anélkül, hogy kifejezetten iterátort vezetnének be. Ezt gyakran egy -egy vezérlő struktúra valósítja meg , például a következő példákban:

# 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

Figyelem, a Javascriptben nem közvetlenül az objektumokat, hanem a nevüket iteráljuk

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

A C ++ nyelv rendelkezik a sablon funkcióval is, std::for_each()amely lehetővé teszi a hasonló implicit iterációkat, de mégis megköveteli az iterátor objektumok megadását bemeneti paraméterként.

Megjegyzés  : A Ruby, a Python és a C # a 2.0-s verziójától yieldegy speciális eszközön keresztül kínálnak iterátorokat.

A PHP nyelv az 5. verzió óta iterátorokat hajt végre az SPL- en keresztül .