Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Iteratory
Forum PHP.pl > Forum > PHP > Object-oriented programming
maniekl2
Ostatnio zagłębiłem się w temat iteratorów, jednak nie jestem do końca pewien czy dobrze zrozumiałem. Wszędzie są typy iteratorów, a nigdzie nie mogę znaleźć klarownego wytłumaczenia co to w ogóle jest i do czego służy.
Z tego co zrozumiałem to iterator to:
obiekt który ma dostęp do innego obiektu i...
Właśnie co on robi?
Jak przeglądałem różne typy to wywnioskowałem że pojawia się zawsze przy jakiś listach, np. listy plików, lista danych pobranych z bazy itp. (wszystko co robi się z pomocą pętli)
Czy te całe iteratoy to właśnie to pobieranie różnych elementów z obiektu do którego ma dostęp iterator i wyświetlanie jako lista?
wookieb
Iterator jest najczęśćiej używany w pętlach. Jest to taka... forma tablica przechowującej dane, z taką różnicą, że możesz kontrolować dane jakie wrzucasz do tego iteratora. Możesz wykonywać parę innych operacji. Świetnym przykładem jest tutja DirectoryIterator, który zobaczysz w manualu php.
Zobacz jak on działa, jak się używa i spróbuj wymyśleć jak mógłbyś to zrealizować na samych tablicach i czy byłoby to łatwiejsze w użyciu.
batman
Iteratory stanowią specjalny typ, który umożliwia (jak sama nazwa wskazuje) iterację (przechodzenie) po elementach kolekcji. W przypadku PHP iteratory są stworzone nieco na wyrost, jednak w językach, w których nie można od tak przekroczyć rozmiaru np listy, umożliwiają przejście przez całą kolekcję bez obawy o przekroczenie zakresu.
Podczas korzystania z iteratora nie obchodzi nas struktura danych, po których iterujemy, ponieważ to na iteratorze właśnie spoczywa obowiązek zapewnienia bezpiecznej pracy.
thek
To ja odpowiem może w sposób możliwie najbadziej lopatologiczny. Wiesz co to jest licznik, wskaźnik? Iterator to taka bardziej rozbudowana forma tego rozwiązania smile.gif O ile licznik normalnie jest typu liczbowego by skakać w pętli, a wskaźnik jest adresem określonego miejsca w tablicy tak iterator jest jakby udoskonaloną wersją wskaźnika i rozszerzony o kilka dodatkowych włsaności, z których część wymienili moi poprzednicy smile.gif
maniekl2
Coś mi świtało i chyba już rozumiem. Dzięki. Jednak wydaje mi się że te iteratory są trochę na wyrost tak jak wspomniano wcześniej
wookieb
Oczywiście wszystko zależy do czego ich używasz. Podałem przykład kiedy warto go użyć. Na szczęscię do większości przypadków wystarczą tablice.
thek
Wookieb ma rację. Do większości przypadków tablice wystarczą. Iteratory mają niestety tę wadę, że to klasy dość uniwersalne, a co za tym idzie, wolniejsze. Zawierają one bowiem wiele dodatkowego kodu, własności, które w większości przypadków nie są wcale wykorzystywane. Są fajne w użyciu, skracają kod, ale niestety kosztem wydajności. To samo rozwiażanie oparte na iteratorach może byc kilkukrotnie wolniejsze niż to samo oparte na tablicy, choć nie można ukryć, że iteratory są bezpieczniejsze i dobrze przemyślane.
maniekl2
Stworzyłem prosty kod obliczający silnie jako przykład iteratorów i mam pytanie czy dobrze to napisałem?
  1. <?php
  2. class test implements Iterator
  3. {
  4. public $valid=true;
  5. public $silnia;
  6. public $key=1;
  7. public $wynik=1;
  8.  
  9. public function __construct($silnia)
  10. {
  11. $this -> silnia = $silnia;
  12. }
  13. public function rewind()
  14. {
  15. //wiem że to służy do powrotu do 1 elementu ale nie wiem jak tego użyć
  16. }
  17. public function current()
  18. {
  19. return $this ->wynik;
  20. }
  21. public function key()
  22. {
  23. return $this ->key;
  24. }
  25. public function next()
  26. {
  27. if($this->key < $this-> silnia)
  28. {
  29. $this -> key++;
  30. $this -> wynik = $this -> wynik * $this -> key;
  31.  
  32. } else{
  33. $this -> valid = false;
  34. }
  35.  
  36. }
  37. public function valid()
  38. {
  39. return $this -> valid;
  40. }
  41.  
  42. }
  43.  
  44. $myiterator = new test(7);
  45. echo 'Działania:';
  46. while($myiterator -> valid()){
  47. echo $myiterator -> current();
  48. $myiterator -> next();
  49. }
  50. echo 'Wynik: '.$myiterator -> current().'';
  51. ?>
  52.  

mike
Cytat(maniekl2 @ 16.03.2010, 00:34:45 ) *
Stworzyłem prosty kod obliczający silnie jako przykład iteratorów i mam pytanie czy dobrze to napisałem?
Bez czytania dalszej treści już Ci mogę powiedzieć, że źle.
Iterator to wzorzec zachowania polegający na sekwencyjnym dostępie do kolekcji. A u Ciebie żadnej kolekcji nie ma, jest to złe użycie wzorca.

Równie dobrze możesz końcówką młotka wkręcać wkręty. Też się może uda. Ale nie zdziw się jak ktoś popuka Ci się w głowę tongue.gif
zegarek84
ok ok winksmiley.jpg, ale jak na początek...
Cytat(mike @ 16.03.2010, 08:44:54 ) *
Równie dobrze możesz końcówką młotka wkręcać wkręty. Też się może uda. Ale nie zdziw się jak ktoś popuka Ci się w głowę tongue.gif

i tu nie mogę się powstrzymać - skoro używacie takich powiedzeń to ja z życia wzięty przykład - akurat na budowie do wkręcania wkrętów do kołków rozporowych 99% osób używa młotków a nie wkrętarek winksmiley.jpg - jeden raz pac i wkręt wkręcony winksmiley.jpg (tu się nikt nie "bawi" a kołek trzyma mocno)... taka analogia ale jak na samo pierwsze użycie moim zdaniem powyższe może być... znając podstawową zasadę powinien szybko załapać jak chodzić po tablicach, odpowiednio dając warunki po obiektach czy "nietypowo" po drzewie DOM itp. itd....
thek
Zegarek... A potem się dziwić, czemu kołki wypadają. Sam gdybym tak robił to haki w futrynie by mi wypadły dzień po "wkręceniu". Zwłaszcza, że przebiwszy się przez metal wiertarką kląłem na budowlańców. Jest pusta przestrzeń i nie idzie normalnego kołka osadzić - cały "lata". Pacnięcie młotkiem = zapomnij o tym, że osłonkę kołka jeszcze ujrzysz winksmiley.jpg Będę musiał użyć jakiegoś wypełniacza, by puste przestrzenie wypełnić. A pianki montażowej boję się użyć bo patrząc na solidność ścian, gdy ona napęcznieje to mi ściany w tym miejscu popękają lub je rozerwie. Bo nie wiem jak duże są luki wewnątrz i ile pianki wtrysnąć. W każdym razie kołek o długości 15cm + lekko nakręcona osłonka (czyli dodatkowe około 10cm) wchodzi cały i nie czuć oporu. W efekcie przy obciążeniu kołek nie ma się jak zaklinować na osłonie i "wypada" smile.gif Młotka można użyć najwyżej do wbicia osłonki. Nie samego wkręta bo gwint osłony rozwalisz. Ale to Polska. Tu prowizorka wytrzyma dłużej niż planowane tygodniami rozwiązania winksmiley.jpg
mike
Cytat(zegarek84 @ 16.03.2010, 11:21:15 ) *
ok ok winksmiley.jpg, ale jak na początek...
Jest źle przede wszystkim dlatego, że to początek!
Nie namawiaj judzi do partactwa bo się przyzwyczają.
maniekl2
Ok, ale na przykład użycie iteratorów przy klasie pobierającej wartości z bazy Mysql ma już sens ? Np. gdy jest wiele wyników SELECT'a to wtedy ma sekwencyjny dostęp. Czy nadal źle ?smile.gif
batman
Zamiast kombinować, sprawdź dostępne iteratory. Przeanalizuj ich budowę, sprawdź do czego służą, a potem zabierz się za pisanie swoich rozwiązań.
damiankopiec
Przykładowo jeśli Twoja klasa do obslugi bazy zwraca dane "opakowane" w klase implementującą iterator wtedy to ma sens.
Crozin
Jeżeli masz jakąś kolekcję obiektów (utworzonych na podstawie danych z bazy) to jak najbardziej możesz sobie użyć Iteratora do poruszania się po niej.
Cysiaczek
Nie, to akurat bardzo pożyteczne rozwiązanie, ale też nie zawsze.
zegarek84
Cytat(thek @ 16.03.2010, 11:37:26 ) *
Zegarek... A potem się dziwić, czemu kołki wypadają. Sam gdybym tak robił to haki w futrynie by mi wypadły dzień po "wkręceniu". Zwłaszcza, że przebiwszy się przez metal wiertarką kląłem na budowlańców. Jest pusta przestrzeń i nie idzie normalnego kołka osadzić - cały "lata"....

założę się, że pustaki ceramiczne ;p - z pustkami powietrznymi - ceramiczne są dosyć kruche - "dziurę" wierci sie na głębokość kołka a i na szerokość - więc kołek nie ma gdzie wpaść ;p - wbijając wkręta rozszerzasz ten kołek rozporowy - wkręta już nie wyciągniesz chyba, że z kołkiem jeśli kołek był za mały lub dziura za bardzo rozwiercona (trzeba szerszy kolek) - ale ceramiczne pustaki to gdzie się nie ruszysz może się cały pokruszyć (ale niby cieplejsze i lepsze od żużlowych)...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.