Byte-Welt Forum

Zurück   Byte-Welt Forum > Andere Sprachen > Scriptsprachen

Scriptsprachen PHP/Python/Perl usw.

Antwort
 
Themen-Optionen Thema durchsuchen
Alt 23.03.2010, 08:16   #1
0x7F800000 starter
 
Benutzerbild von 0x7F800000
 
Registriert seit: 09.05.2009
Beiträge: 6
0x7F800000 befindet sich auf einem aufstrebenden Ast
Standard keine Sprachkonstrukte für IteratorAggregate?

Hallo!

Ich habe gestern (wieder) angefangen, mir ein paar (nie da gewesene und längst vergessene) PHP5-kenntnisse anzueignen, hab erstmal eine einfach verkettete Liste geschrieben, diese funktioniert auch, wo ich aber nicht vorankomme: wie mache ich so etwas zu einem IterableAggregate? Wohin mit der Iterator-Klasse? Instanzen der Iterator Klasse müssen ja irgendwie auf die "Innereien" der LinkedList-Klasse zugreifen (etwa auf "head" beim rewind).

- nested classes gibt es nicht, ansonsten könnte man Iterator als geschachtelte Klasse in LinkedList implementieren

- anonyme inner classes (wäre mein instrument der wahl in java gewesen) gibt es nicht

- "package-sichtbarkeit" oder "datei-sichtbarkeit" gibt es nicht (ansonsten könnte ich die "innereien" datei-sichtbar deklarieren, und mich damit begnügen)

- so etwas wie friend-klassen aus C++ gibt es anscheinend auch nicht

- einfach alles public deklarieren? Wozu der Zirkus dann überhaupt?

mir sind leider irgendwie die ideen ausgegangen, ich wüsste nicht mal, wonach ich googlen soll?

Hab mal in der Implementierung von SplDoublyLinkedList nachgeschaut: es implementiert nur Iterator[nix Aggregate!]?

Heißt es dann, dass man über eine Liste mit zwei Iteratoren gleichzeitig nicht mal lesend laufen kann?

Danke im Voraus.

PS: hab eben rausgefunden, dass PHP auch keine Threads unterstützt... omg^^ ó_Ò?
__________________
aka Andrey
0x7F800000 ist offline   Mit Zitat antworten
Alt 23.03.2010, 12:08   #2
VuuRWerK
Moderator
 
Benutzerbild von VuuRWerK
 
Registriert seit: 14.05.2007
Ort: Dresden
Beiträge: 332
VuuRWerK befindet sich auf einem aufstrebenden Ast
VuuRWerK eine Nachricht über ICQ schicken VuuRWerK eine Nachricht über Skype™ schicken
Standard AW: keine Sprachkonstrukte für IteratorAggregate?

Also das Interface IteratorAggregate ist erstmal dazu da einem Typen die Fähigkeit zu verleihen das man diesen iterieren kann, d.h. es ermöglicht das man ein Objekt dieses Typs wie ein Array in foreach verwenden kann. Dabei spielt es noch keine Rolle welcher Typ von Iterator diesen Typ unterstützt.

Jetzt kommen wir zum Iterator selbst: Das Interface Iterator kann man implementieren um einen Iterator zu erstellen. Jetzt ist es Deine freie Entscheidung ob Du jetzt eine eigene Klasse als Iterator implementierst. Genauso könntest Du die Klasse die Du iterieren möchtest selbst das Iterator Interface implementieren lassen.

Eine Klasse gegen beide Interfaces zu implementieren wäre redundant und unsinnig. Denn wenn Du bereits das Iterator Interface implementierst brauchs Du nicht noch zusätzlich ein Aggregate dafür.

Bsp:
PHP Code:
  1. class MyLinkedListIterator implements Iterator {
  2.   public function __construct(MyLinkedList $list) {
  3.   }
  4.   // implement the iterator stuff ...
  5. }
  6.  
  7. class MyLinkedList implements IteratorAggregate {
  8.   // implement the linked list stuff ...
  9.  
  10.   public function getIterator() {
  11.     return new MyLinkedListIterator($this);
  12.   }
  13. }
oder:
PHP Code:
  1. class MyLinkedList implements Iterator {
  2.   // implement the linked list AND iterator stuff ...
  3. }

Da Du Dir jetzt noch Gedanken zur Sichtbarkeit der Listelemente gemacht hast wäre es in Deinem Falle am besten das Iterator Interface direkt in Deine Liste zu implementieren, genau so wie es die SPL macht. Wenn nicht wäre es eine Aufgabe für Dich Dir Gedanken zu machen wie Du Deine Listenknoten dem Iterator sichtbar machst (sinnvolle getter/setter etc.).

Gut Schuß
VuuRWerK
__________________
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

"make the impossible possible, the possible easy, and the easy elegant." (Moshé Feldenkrais)
VuuRWerK ist offline   Mit Zitat antworten
Alt 23.03.2010, 16:08   #3
0x7F800000 starter
 
Benutzerbild von 0x7F800000
 
Registriert seit: 09.05.2009
Beiträge: 6
0x7F800000 befindet sich auf einem aufstrebenden Ast
Standard AW: keine Sprachkonstrukte für IteratorAggregate?

Zitat:
Zitat von VuuRWerK Beitrag anzeigen
Eine Klasse gegen beide Interfaces zu implementieren wäre redundant und unsinnig.
redundant & unsinnig: ja, äquivalent: nein.
IteratorAggregate kann bei jeder getIterator-anfrage einen _neuen_ iterator liefern, insbesondere kann eine datenstruktur von mehreren unabhängigen iteratoren durchlaufen werden.
Zitat:
PHP Code:
  1. class MyLinkedListIterator implements Iterator {
  2.   public function __construct(MyLinkedList $list) {
  3.   }
  4.   // implement the iterator stuff ...
  5. }
"implement iterator stuff" geht imho eben nicht, weil's mit der sichtbarkeit nicht hinhaut, oder zumindest mal hässlich wird, sodass es rein gar nichts mehr mit sauberem code zu tun hat...

Angesichts der tatsache, dass man mit php eh nicht multithreaden kann, gebe ich mich also mit direkten Implementierung von Iterator (nach Vorbild der SPL) zufrieden: Beispiele, wo man mehrere Iteratoren gleichzeitig braucht, sind eh ein wenig konstruiert... Also, es gibt natürlich ein paar wichtige algorithmen, wo man das gut gebrauchen kann, aber es macht wenig bis gar keinen sinn, diese in php zu implementieren. Daher bin ich auch mit dem wenigen zufrieden, was die Mächtigkeit von PHP so hergibt.

Danke.
__________________
aka Andrey
0x7F800000 ist offline   Mit Zitat antworten
Alt 25.03.2010, 08:30   #4
VuuRWerK
Moderator
 
Benutzerbild von VuuRWerK
 
Registriert seit: 14.05.2007
Ort: Dresden
Beiträge: 332
VuuRWerK befindet sich auf einem aufstrebenden Ast
VuuRWerK eine Nachricht über ICQ schicken VuuRWerK eine Nachricht über Skype™ schicken
Standard AW: keine Sprachkonstrukte für IteratorAggregate?

Zitat:
Zitat von 0x7F800000 Beitrag anzeigen
redundant & unsinnig: ja, äquivalent: nein.
Hab ich nie behauptet sondern ich bin nur oberflächlich geblieben um Dich eigentlich nicht noch mehr zu verwirren.

Zitat:
Zitat von 0x7F800000 Beitrag anzeigen
IteratorAggregate kann bei jeder getIterator-anfrage einen _neuen_ iterator liefern, insbesondere kann eine datenstruktur von mehreren unabhängigen iteratoren durchlaufen werden.
Richtig, das war aber nicht Deine Frage

Zitat:
Zitat von 0x7F800000 Beitrag anzeigen
"implement iterator stuff" geht imho eben nicht, weil's mit der sichtbarkeit nicht hinhaut, oder zumindest mal hässlich wird, sodass es rein gar nichts mehr mit sauberem code zu tun hat...
Auch wenn man das nicht macht doch zitiere ich mich mal fix selbst:
Zitat:
Zitat von VuuRWerK
Da Du Dir jetzt noch Gedanken zur Sichtbarkeit der Listelemente gemacht hast wäre es in Deinem Falle am besten das Iterator Interface direkt in Deine Liste zu implementieren, genau so wie es die SPL macht. Wenn nicht wäre es eine Aufgabe für Dich Dir Gedanken zu machen wie Du Deine Listenknoten dem Iterator sichtbar machst (sinnvolle getter/setter etc.).
Vor dem Problem stehst Du aber nicht nur bei PHP sondern auch anderen Sprachen. In Java und C# mag es mithilfe der Package-Sichtbarkeit und/oder Inner-Classes gehen aber ob das der Weisheit letzter Schluß ist oder nur eine Krücke? Bei C++ hat man zwar auch wieder Inner-Classes aber bei einem Blick in die STL sieht man das für iteratoren keine Inner-Classes verwendet werden sondern extern implementiert sind, gut in C++ hat man wieder die Möglichkeit der direkten Speichermanipulation (so zum Beispiel der std::vector< T > und dessen iterator Implementierung: chunk (data()), index, length).

Also wie gesagt, Iterator Interface direkt implementieren und damit leben, dass wenn man mit PHP arbeitet an einigen Ecken immernoch dazu gezwungen ist "unsauberen" Code zu produzieren. Schau Dir die API von PHP an da weißt Du vorher es kommt

Gut Schuß
VuuRWerK
__________________
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

"make the impossible possible, the possible easy, and the easy elegant." (Moshé Feldenkrais)
VuuRWerK ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
-


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Spring + Hibernate = Keine JDBC Verbindung EagleEye APIs & Frameworks (neu) 1 13.03.2009 22:07
Oberlandesgericht Frankfurt: Keine Haftung für offene WLANS Revenant Sicherheit 0 08.07.2008 18:42
Warum gibt es in Java keine Operatorüberladung? VuuRWerK Java Standard Edition (J2SE) 3 23.11.2007 15:49
Aptana macht keine Einzüge oO christoph IDEs & Tools 5 11.10.2006 19:12
Keine Lust zum Lernen PaNic Spielwiese 34 31.07.2006 09:18


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 Uhr.


Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.