WikiDer > Iterator
EIN Iterator ist eine standardisierte Methode zur Identifizierung der Elemente von a Datencontainer durchgehen. Iterator ist bekannt als a Designmuster in der Kategorie Verhalten (Verhalten).
Dies erspart dem Containerbenutzer das Schreiben von fehleranfälligem Code.
Beispiel
Die Elemente von a Array Durchgehen ist nicht schwer, ein einfaches für Schleife löst es wie in diesem Beispiel in C .
// Deklarationen und Definitionen#define ARRAYLength 100MyClass array[ARRAYLength];// an anderer Stelle im Codefor (int counter= 0; counterUm eine andere Datenstruktur anstelle eines Arrays zu verwenden, zum Beispiel a Baum oder ein Hash-tabelle, wird diese einfache Schleife plötzlich viel komplizierter. Dies kostet den Programmierer Arbeit und ist vor allem fehleranfällig.
Außerdem muss der Programmierer in die genaue Funktionsweise des betreffenden Containers eintauchen. Außerdem ist es schwierig, später einen anderen Container zu wählen, da dann der gesamte Code, der durch die Elemente läuft, neu geschrieben werden muss.
Hier ist ein möglichst prägnantes Beispiel für das Durchlaufen eines Binärbaums.
// Deklarationen und DefinitionenMyTree tree;void loopTree(MyTree *subtree){ if (subtree==NULL) return; loopTree (Unterbaum->linker Zweig); do_something_with(*Teilbaum->Objekt); loopTree(subtree->rightBranch);} // an anderer Stelle im Code loopTree(&tree);Für andere Containertypen gilt eine andere Ablauflogik. Wird ein Iterator verwendet, wird der Benutzer des Containers davon abgeschirmt. Das folgende Beispiel verwendet einen Iterator, dessen Schleifenlogik im Container selbst gespeichert ist. Der Iterator heißt in diesem Fall auch a Mauszeiger erwähnt.
// Deklarationen und Definitionen MyContainer container;// an anderer Stelle im Codefor (MyCursor cursor= container.getCursor(); !container.isDone(cursor); container.next(cursor)) { do_something_with(*container.getObject(cursor)) ; }Das Schöne an obigem Beispiel ist, dass der Programmierer nicht wissen muss, wie der Container funktioniert, a Array, Hash-tabelle, ein Baum, ein verlinkte Liste, Es ist alles das Gleiche. Änderungen im Container spielen keine Rolle, da die Schnittstelle Bleibt das selbe. Die englischsprachige gebruikte Methodennamen im obigen Beispiel (getCursor, isDone, next, getObject) sind recht häufig.
Ein Cursor ist eine Variante eines Iterators, die seltener verwendet wird. Normalerweise wird die Schleifenlogik in den Iterator selbst eingefügt. Dies hat den Vorteil, dass ein anderer Durchlauf (zB von hinten nach vorne) genutzt werden kann, ohne den Behälter verstellen zu müssen.
Dies gibt mehr Flexibilität. Der Code sieht fast genauso aus wie im vorherigen Beispiel, außer hier sind die Methoden Mitglied der Iteratorklasse und die Fabrikmethode 'getCursor()' fehlt.
// Deklarationen und Definitionen MyContainer container();// an anderer Stelle im Codefor (MyIterator iterator(container); !iterator.isDone(); iterator.next()) { do_something_with(*iterator.getObject()); }Benutzen
Iteratoren werden mit vielen Containerbibliotheken verwendet. Das STL im C nutzt sie intensiv. Microsoft hat in seiner Visual Basic sogar ein 'ForEach'-Befehl, der eine Standardschnittstelle verwendet, um durch Container zu blättern. Auch der Java-Bibliothek verwendet Iteratoren für seine Container. Im C# und .GERADE sind Iteratoren sogar so gründlich in Sprache und Framework integriert, dass 'foreach' automatisch über Objekte iteriert, die de SchnittstelleIEzählbar implementieren. Ebenfalls PHP hat seit Version 5 eine Standardschnittstelle für Iteratoren.
Überlegungen zur Implementierung
- Um eine zweite Art von Iteration zu implementieren (zB von hinten nach vorne) kann ein vorhandener Iterator verwendet werden, der dann in zwei Modi arbeiten kann. In diesem Fall ist es jedoch besser, einen zweiten Iterator zu erstellen.
- Ein Iterator, der den Schleifencode enthält, wird am besten von einer Iteratorklasse oder -schnittstelle abgeleitet, die Freund gehört zur Containerklasse. Dann gibt es keine Notwendigkeit im Container Öffentlichkeit Zugriffsmethoden definiert werden.
- Dem Iterator-Builder steht es frei, neben der Standardschnittstelle weitere Methoden hinzuzufügen, wie zum Beispiel 'vorherige()'. Dies ist jedoch nicht polymorph mit anderen Iteratoren.
Siehe auch
Quellen, Anmerkungen und/oder Verweise
- Erich Gamma - Richard Helm - Ralph Johnson - John Vlissides, Designmuster, Addison Wesley, 1995.