![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Witam, mam problem z leniwą konkretyzacją (czyli opóźnioną inicjacją niektórych cech obiektów).
Sprawa wygląda tak, że mam kolekcję obiektów -> dajmy na to książek. Kolekcja na początku inicjuje książki -> ale tylko autorów i tytuł ->spis rozdziałów chciałbym aby był inicjowany z "opóźnieniem" - tylko wtedy, kiedy będzie potrzebny. Generalnie wszystko jest proste jeśli rozważamy to z perspektywy jednej książki -> wystarczy stworzyć obiekt, i przy próbie wywołania metody ksiazka->podajRozdzialy - odczytujemy je z bazy i inicjujemy liste rozdzialow. Ja natomiast potrzebuję sposobu, aby w razie próby odczytania spisu treści jednej książki, automatycznie odczytać spisy treści pozostałych książek znajdujących się w kolekcji. Na początku myślałem, że będzi to proste, ale okazuje się, że utknąłem w tym punkcie. Myślałem o wykorzystaniu wzorca obserwatora -> ale tu pojawia się problem, bo każda ksiażka musiałaby mieć referencję do kolekcji książek - co spowoduje zapętlenie -> książka jest elementem kolekcji i jednocześnie kolekcja jest elementem książki... Przyznam się szczerze, że nie próbowałem zapisać kodu tego rozwiązania, więc nie mam 100% pewności, że to by nie działało, ale chyb nie będzie działac... Czy jest jakiś wzorzecz/ metoda, którą mógłbym wykorzystać do obejścia tego problemu. Dodam, że jest to dla mnie bardzo ważne, gdyż przykiład jest uproszczeniem, w moim przypadku, gdyby udało mi się rozwiazać ten problem zaoszczędzę dużo pracy bazie danych. |
|
|
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Takie gotowce to ja moge pisać
![]()
Przykład taki jak szukałeś, z tym że zamiast listy rozdziałów jest generowana ich liczba jak tylko dla jakiejś książki wywołana zostanie mutoda getChaptersCount(). Nie pisałem komentarzy bo pisałem to na szybko, jak potrzeba coś wytłumaczyć to wołaj. Jednym słowem książka powinna wiedzieć w jakiej jest kolekcji ![]() |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Ale się porobiło - człowiek zadaje pytanie, wychodzi, wraca a tu czeka gotowiec od moda - rozpuszczanie userów:D
A tak już serio to dokładnie o to mi chodziło. Z tego co widzę, to obiekt Book posiada referencję do BookCollection. Myślałem nawet nad takim rozwiązaniem - ale stwierdziłem, że to się nie może udać... a tu niespodzianka - php nie wpadło w rekurencję. Mike_mech - powiedz mi tylko jeszcze, czy dobrze wnioskuję, ale to jest możliwe dzięki temu, że obiekty book nie zawierają kolekcji tylko wskaźnik na nią? W takim układzie ten przykład działa tylko na php5 bo php4 chyba przekazuej obiekty przez wartość domyślnie(chociaż nie jestem pewien bo nie pisałem w php4)? Piszę na php5 ale tak pytam, żeby się czegoś dowiedzieć. Jeszcze raz dzięki za pomoc - moja baza będzie ci wdzięczna :-) edit Cytat private $arrExampleTitles = array( 'Przygody Nospora Puchatka', 'Dzieci z Bulerbyn', 'Przygody Tolka Banana', 'W Pustyni i w Puszczy' ); ![]() Ten post edytował athabus 22.08.2006, 21:46:32 |
|
|
![]()
Post
#4
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Ale się porobiło - człowiek zadaje pytanie, wychodzi, wraca a tu czeka gotowiec od moda - rozpuszczanie userów:D Raz do roku i moderatorzy mówią ludzkim głosem.A tak już serio to dokładnie o to mi chodziło. Z tego co widzę, to obiekt Book posiada referencję do BookCollection. Myślę, że relacja bedzie tu właściwszym słowem. Referencja za bardzo sie kojarzy ... ![]() Mike_mech - powiedz mi tylko jeszcze, czy dobrze wnioskuję, ale to jest możliwe dzięki temu, że obiekty book nie zawierają kolekcji tylko wskaźnik na nią? Dokładnie takie cos jest proste do zrealizowania jeśli założy się że nie tylko kolekcja wie wszystko o kolekcjonowanych obiektach, ale też obiekty wiedzą co się z nimi dzieje i maja odwołanie do obiektu kolekcji, która je zawiera.Wtedy można zrobić takie obserwowanie, a raczej sytuacje kiedy obiekt mówi kolekcji: "Hej, patrz. Coś się stało. Zareaguj." W takim układzie ten przykład działa tylko na php5 bo php4 chyba przekazuej obiekty przez wartość domyślnie(chociaż nie jestem pewien bo nie pisałem w php4)? Powiem szczerze. Olewam PHP4 i nie interesuje mnie czy to zadziała i jak zadziała ![]() Już od prawie dwóch lat nie programuję w PHP4. P.S. Mój kod ma bug'a. Praca domowa polega na znalezieniu ![]() ![]() Podpowiedź: sprawdź co się stanie jeśli będzie tylko jeden obiekt w kolekcji. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
P.S. Mój kod ma bug'a. Praca domowa polega na znalezieniu ![]() ![]() Podpowiedź: sprawdź co się stanie jeśli będzie tylko jeden obiekt w kolekcji. No chociaż coś - bo jeszcze by sie userzy rozkaprysili ![]() Dzięki za pomoc - zabieram się za kodowanie. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
@athabus - masz powazniejsze zadanie, a mianowicie przekonstruowanie mechanizmu, ktory przedstawil mike_mech w taki sposob aby do pobrania listy rozdzialow dla wszystkich ksiazek w kolekcji uzyc tylko jednego zapytania do bazy danych a nie tylu zapytan ile jest ksiazek.
Ten post edytował bigZbig 23.08.2006, 14:30:36 -------------------- bigZbig (Zbigniew Heintze) | blog.heintze.pl
|
|
|
![]()
Post
#7
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Dokładnie.
W tej chwili pobranie jednej ilości rozdziałów powoduje że kolekcja pobiera ilości dla wszystkich. Ale dla wszystkich lecąc po kolei i pobierając pojedynczo. A jak ~bigZbig powiedział to nie może być pętla i dla każdego getChaptersCount() musi to być coś w stylu getAllChaptersCountAndAssignToBooks() ![]() |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
@bigZbig - właśnie po to to robię
![]() No i po to mi właśnie było to, co mike_mech nazwał "świadomością obiektu o przynależności do kolekcji". Tak jak pisałem w pierwszym poście - chciałem użyć wzorca obserwatora, ale bałem się rekurencji (kolekacja tworzy obiekt->obiekt zawiera kolekcję, więc tworzy nową kolekce itp itd) - nie wziąłem jednak pod uwagę że obiekt może zawierać wskaźnik na kolekcję ![]() |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Tak naprawde to co napisal mike_mech jest realizacja wzorca obserwatora (z mala modyfikacja) tyle, ze niesformalizowana tzn obserwator i obserwowany nie implementuja odpowiednich interfejsow np. z biblioteki SPL tj. SplObserver i SplSubject. Tak czy inaczej idea zaczerpnieta jest ze wzorca obserwatora.
--- Wszystko się wydało ![]() ~mike_mech -------------------- bigZbig (Zbigniew Heintze) | blog.heintze.pl
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
@mike_mech: w Twoim kodzie gdzieś jest błąd. Pewnie przez to losowanie. Poodświeżaj sobie stronę kilkanaście raz. W linijce 119.
-------------------- ”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335) |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
mike_mech już o tym pisal - problem jest gdy jest 1 obiekt w kolekcji tylko :-)
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
mike_mech już o tym pisal - problem jest gdy jest 1 obiekt w kolekcji tylko :-) Dlaczego? -------------------- ”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335) |
|
|
![]()
Post
#13
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Błąd popełniłem w linii 36 w metodzie getRandomBook().
Zwraca ona obiekt z kolekcji, tylko wtedy jeśli zawiera ona więcej niż jeden element:
A powinna zwracać wtedy kiedy jest więcej niż zero:
~J4r0d jak dołączasz do dyskusji to prześledź jej wcześniejszy przebieg. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 15.08.2025 - 04:02 |