Diskussion:Iterator (Entwurfsmuster)

Letzter Kommentar: vor 19 Jahren von Trugbild in Abschnitt Iterator ist kein Entwurfsmuster

Überarbeiten

Bearbeiten

Ich habe mal den Überarbeiten-Baustein gesetzt, damit nicht in Vergessenheit gerät, dass hier noch einige Abschnitte gänzlich ohne Inhalt sind. --Chriki 18:31, 8. Mär 2005 (CET)

Ich hab' mal ein bißchen weiter gemacht.
Müssen die Codebeispiele wirklich sein? MMn viele Zeilen mit wenig Nährwert. In Sachen Java bin ich zwar Außenstehender, aber ich denke das Beispiel zum internen Iterator ist ein komplizierter NOP. --thomasv 18:37, 15. Apr 2005 (CEST)
Kommt drauf an, an welche Zielgruppe sich das Wiki richtet, habe noch keinen relativen Anfänger getroffen, der aufgrund der abstrakten Beschreibung eines internen Iterators wusste was das genau ist... --Heri 12:27, 26. Apr 2005 (CEST)
Naja ein Lexikon kann natürlich kein Fachbuch ersetzen. Im Buch sind das immerhin 14 bzw. 18 Seiten über Iterator. Und speziell im Beispiel hier macht iterator.apply(new MyObjectHandler()); mMn _nichts_. (Es sei denn, der Java-Iterator hat die Eigenschaft sich selber wieder auf den Anfang zu setzen.) Die Code-Beispiele haben immer das Problem, daß sie im Detail schwer zu verstehen sind, wenn einem die spezielle Sprache fremd ist. Ein paar Bilder wären da sinnvoller. (siehe die 3 Punkte bei UML-Diagramm). Dummerweise habe ich momentan nicht viel Zeit, und Besserung ist nicht Sicht... :-( --thomasv 12:46, 26. Apr 2005 (CEST)
Der Überarbeiten-Baustein kann wieder entfernt werden, oder gibt es Einwände? --guwac 11:27, 2. Mai 2005 (CEST)Beantworten
Ich finde Beispiele (gerade bei Entwurfsmustern) sehr, sehr hilfreich. Aber wenn schon, dann sollte der Code 1. vollständing (nur ganze Klassen) und 2. richtig sein. Wie oben schon angesprochen ist der Aufruf 'iterator.apply(new MyObjectHandler());' nach 'iterator.print();' sinnfrei, da der Iterator schon am Ende ist. Besser wäre folglich eine ganze Testklasse mit beiden Optionen jeweils getrennt mit eigener Instanziierung des MyObjectIterators. --majjb 19:18, 17. August 2015 (CEST)

Iterator ist kein Entwurfsmuster

Bearbeiten

Ich finde den gesamten Artikel extrem schwach und zum Grossteil absolut falsch. Ein Iterator ist kein Entwurfsmuster. Es gibt Entwurfsmuster für Iteratoren - aber das macht nicht automatisch jeden Iterator zu einem Entwurfsmuster. Ausserdem ist es absolut möglich, dass man einen Iterator erstellt, bei dem man die zugrundeliegende Listenstruktur kennen muss. Dass der Iterator den User davon abkoppelt ist keineswegs eine Bedingung! Was hier geschrieben wurde, klingt verdammt nach einer Zusammenfassung der Beschreibung eines Iterator-Patterns aus einem Buch der drei Amigos oder der Gang of Four (worauf ja auch verwiesen wird). Ein Iterator ist ein Element das iteriert! --Trugbild 12:54, 26. Apr 2005 (CEST)

Ähm, zweck des Artikel ist, wie bis eben auch noch da stand, das Entwurfsmuster Iterator zu beschreiben, von wo er auch verlinkt ist. Wenn Du einen allgemeineren Iterator beschreiben möchtest, dann sollte diesen Artikel zu Iterator (Entwurfsmuster) konkretisieren (wie schon mit meisten anderen Entwurfsmuster geschehen). --thomasv 13:20, 26. Apr 2005 (CEST)
Okay... Dann sollte das aber wirklich sowohl am Titel, wie auch am Text erkennbar sein. Da stand klar und deutlich "Der Begriff Iterator (auch: Cursor) steht für ein Entwurfsmuster aus dem Bereich der Softwareentwicklung" und das ist einfach nicht richtig. --Trugbild 13:25, 26. Apr 2005 (CEST)
Ist, wie's scheint, historisch gewachsen. Die Muster wurden ursprünglich nur bei ihren Namen genannt. Wenn man von Entwurfsmuster kommt ist ja alles OK, aber wenn man von sonstwo kommt ist das natürlich -ähm- verwirrend. Wenn mir niemand zuvorkommt, werde ich das beim nächsten Arbeitseinsatz mit machen. --thomasv 14:05, 26. Apr 2005 (CEST)
Ich finde allerdings nicht, dass man Iterator und Iterator (Entwurfsmuster) unbedingt trennen muss. Einen Iterator hat man schnell erklärt und für detailiertes zum Entwurfsmuster hätte man genügend Platz, ohne den Artikel aufzublähen. Aber ich finde es absolut wichtig, dass in der Einleitung erstmal klar und deutlich steht, was ein Iterator ist. Einverstanden? --Trugbild 14:08, 26. Apr 2005 (CEST)
OK. Wenn jemand über den Iterator als solchen philosophieren möchte, kann man immer noch trennen. --thomasv 14:20, 26. Apr 2005 (CEST)
Ich hab mal die Einleitung ergänzt. Denn z.B. von Iteration wird auch auf diesen Artikel verlinkt. --Trugbild 15:05, 26. Apr 2005 (CEST)

@Trugbild: Ich glaube hier gibt es ein paar begriffliche Differenzen. Ein Iterator zeigt zwar auch irgendwohin, aber er ist kein Zeiger in dem Sinne wie er normalerweise in der Informatik verstanden wird, und auch unter Zeiger (Informatik) definiert ist. Der Iterator ist eindeutig das allgemeinere Konzept. Bei einem Zeiger gibt es lediglich p++, p-- und *p (in C-Syntax) ein Iterator verallgemeinert diese Operationen. Außerdem finde ich die Formulierung, daß Iteratoren zum Iterieren über Listen und Mengen gut sind, extrem eng gefaßt. Das sind Beispiele, die aber nicht den Iterator definieren. --thomasv 12:54, 3. Mai 2005 (CEST)Beantworten

klar ist das noch nicht der Weisheit letzter Schluss. Aber es ist zumindest wesentlich besser als "Der Iterator ist ein Begriff aus der Softwareentwicklung und stellt die Verallgemeinerung eines Zeigers dar." Denn das ist irreführend und falsch. --Trugbild 14:01, 3. Mai 2005 (CEST)Beantworten
Könntest Du diese Ansicht vielleicht auch untermauern? Ein Zeiger ist letzten Endes nur die Speicheradresse eines Datenelementes die selber wieder abgespeichert ist. So eine Adresse kann man als Iterator verwenden aber ein Iterator ist keine Speicheradresse. Die Aussage wird erst dann war, wenn man das Konzept der "Adresse" verallgemeinert. Ein Iterator/Cursor kann ja z.B. auch auf eine Datenbankzeile verweisen. Ein Zeiger kann das nicht. --thomasv 14:55, 3. Mai 2005 (CEST)Beantworten
Ich glaub ich peil langsam, was Du mit Deinem Einleitungssatz sagen wolltest und was Du mit "Verallgemeinerung eines Zeigers" gemeint hast. Jetzt liegt es an Dir zu verstehen, dass eine "Verallgemeinerung" eine Übermenge ist und laut Deinem Einleitungssatz somit jeder Zeiger ein Iterator sein müsste. Wenn Du hingegen die Einleitung des WP-Artikels Zeiger (Informatik) liest, wirst Du keinen Widerspruch zum Iterator-Artikel feststellen können. Auch eine Zeile in einer Datenbank ist ein Datenbereich und beginnt bei einer Speicheradresse - abgesehen davon warst DU es, der den Satz "Der Begriff Iterator (manchmal auch Cursor) stammt aus dem Bereich der Softwareentwicklung und bezeichnet ein Objekt oder einen Pointer, mit dem über die Elemente einer Liste bzw. durch die Elemente einer Menge iteriert wird." entfernt und durch diese völlig verwirrende Kurzeinleitung ersetzt hat. --Trugbild 15:09, 3. Mai 2005 (CEST)Beantworten
Hmm, ein Zeiger ist natürlich ein so elementares Ding, daß er nicht sinnvoll in ist-ein-Beziehungen gesetzt werden kann, ohne in endlosen Diskussionen zu enden. Was verallgemeinert wird, ist eine häufige Anwendung eines Zeigers auf eines von vielen zu zeigen mit der Möglichkeit und von einem zum anderen zu springen. Wenn man bei einer Datenbankzeile von "Speicheradresse" sprechen will, dann ist der Begriff schon reichlich gedehnt. Ich sehe ein, daß mein Einleitungsversuch ziehmlich rumpelig gewesen ist. Die jetzige Fassung liest sich zwar besser, ist aber nicht korrekt. Man kann eine Sache schließlich nicht durch eine Implementationsvariante und eine mögliche Anwendung definieren. Ich werd's in Kürze nochmal versuchen. Aber für heute muß ich erstmal die Segel streichen. --thomasv 17:03, 3. Mai 2005 (CEST)Beantworten
wie gesagt erhebe ich keinen Anspruch darauf, dass der Satz unumstösslich ist - aber ich verteidige die Position, dass er leichter verständlich ist und der Wahrheit näher kommt als der Vorgänger. Und zwar wesentlich näher. --Trugbild 17:16, 3. Mai 2005 (CEST)Beantworten

Enumerator VS Iterator

Bearbeiten

Ich bin über den Begriff Enumerator hier gelandet und der Artikel vermittelt den Eindruck, das ein Iterator und ein Enumerator das gleiche wären - das ist nach meinem Kenntnisstand nicht der Fall! Iteratoren geben die Reihenfolge der gespeicherten Daten in einer Collection wieder, Enumeratoren nicht. Enumeratoren kommen dort zum Einsatz, wo die Reihenfolge der Elemente in der Collection nicht beinflußt werden kann (z.B. Hashtable). Füge ich bei einer Liste Elemente an, dann bekomme ich über den Iterator die Elemente in genau dieser Reihenfolge, bei einem Enumerator nicht zwingend. PF, 24.02.2006

ich möchte die diskussion nochmal aufgreifen, da ich selbst gerade auf ein praktisches problem gestoßen bin. soweit ich das jetzt verstanden habe, kann man mit einem enumerator mengen durchlaufen deren position fix ist (zB arrays), daher auch der wortstamm von Enumeration = "durchnummerieren". iteratoren hingengen ist eine verallgemeinerung davon, da mit iteratoren eine menge durchlaufen werden kann, deren position nicht fix sein muss (zB verlinkte listen), von Iteratoion = "schrittweise annähern".
sollte mir jemand den segen auf die definition geben, so würde ich vorschlagen den redirect trotzdem auf iterator zu belassen, da wir glaube ich nicht soviel über einen enumerator schreiben können um einen eigenen artikel zu rechtfertigen. die begriffe sollten wir aber auf jedenfall trennen und den enumerator würde ich zusätzlich noch vom begriff "Enumeration" (enum type in programmiersprachen) trennen, um verwechslungen vorzubeugen. -- Qopep 17:25, 23. Aug 2006 (CEST)

Iteratoren wie in CLU oder Ruby

Bearbeiten

Was hier meiner Meinung nach bislang völlig vergessen wurde, ist die Art und Weise, wie Iteratoren in CLU eingeführt wurden. Dort sind sie nämlich eine eigenständige Prozedur, die den Schleifenrumpf (unsichtbar und implizit) als Parameter übergeben bekommt. Diese Art von internen Iteratoren wird in den o.g. Sprachen als Sprachkonstrukt zur Verfügung gestellt.

Wir benutzen schon einige Jahre eine improvisierte Variante in Delphi (16 und 32 Bit) mit großem Erfolg. Diese treibt einigen "geferkelten" Aufwand, um vollständig funktionieren zu können, u.a. mit Anparsen des Codes mit Hilfe von Hilfsroutinen. Im folgenden ist iterating eine der besagten Hilfsroutinen. Im wesentlichen ist der Aufruf wie folgt:

iterator(parameters); while iterating do body;

Die üblichen Anwendungen sind bislang das Abklappern eines Containers (Baum, Liste, Verzeichnis, Registry etc.; ggf. mit vorzeitigem Schleifenabbruch) und auch den "pervertierten" Fall, wo nur ein einziger Callback erfolgt, z.B. zum Allozieren und anschließendem Freigeben von Ressourcen oder Locken und Freigeben von Semaphoren oder auch zum "Synchronisieren" (Ausführen des Schleifenrumpfes im Hauptthread). Es gibt keine wirkliche Alternative zu einem solchen Iterator, da der Iterator mit Mitteln der Hochsprache (z.B. Delphi, C++, Java) den lokalen Scope nicht übertragen kann, also nur eine Methode bzw. eine Prozedur aufruft - das führt zum unschönen Aufwand, ein Hilfsobjekt (das kann auch das aktuelle Objekt sein) zu erzeugen, in das man alle Parameter hineinsteckt und nachher wieder herausholt - ein Iterator, der von der Sprache direkt unterstützt wird, kennt solche Probleme nicht!

Die analog japanische Wikipedia-Seite scheint wenigstens einen Hinweis auf Ruby zu enthalten...


-- Jasper1711 17:38, 27. Jul 2005 (CEST)

Aufteilung

Bearbeiten

Ich habe den Artikel aufgeteilt in das Entwurfsmuster und Iterator im allgemeinen. --dbenzhuser 19:38, 17. Sep 2006 (CEST)

Artikel zu fachspezifisch

Bearbeiten

Hallo, für einen Informatik-Anfänger wie mich ist der Artikel viel zu kompliziert. wenigstens in der Einleitung sollte in normalverständlicher sprache stehen, was der Iterator macht oder ist. also nicht nur "Es stellt Möglichkeiten zur Verfügung auf Elemente einer aggregierten Struktur sequentiell zuzugreifen OHNE die Struktur zu enthüllen." sondern, wie er das tut. Klar müssen Fachbegriffe auch sein, es wäre aber nett, wenn ein satz nicht aus 5 fachbegriffen besteht, oder diese wenigstens nochmal kurz erklärt/übersetzt werden könnten. Traversion z.B. ist weder erklärt, noch verlinkt, Aggregat auch nicht. Danke!