Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Leniwa konkretyzacja
athabus
post
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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mike
post
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ć (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

  1. <?php
  2.  
  3. class BooksCollection
  4. {
  5. private $arrExampleTitles = array( 'Przygody Nospora Puchatka', 'Dzieci z Bulerbyn', 'Przygody Tolka Banana', 'W Pustyni i w Puszczy' );
  6. private $arrCollection = array();
  7.  
  8. public function __construct()
  9. {
  10. $intBooksCount = rand( 1, 10 );
  11.  
  12. for( $i=1; $i <= $intBooksCount; $i++ )
  13. {
  14. shuffle( $this->arrExampleTitles );
  15.  
  16. $objBook = new Book( $this->arrExampleTitles[ 0 ] );
  17. $objBook->assignToCollection( $this );
  18.  
  19. $this->addBook( $objBook );
  20.  
  21. }
  22. }
  23.  
  24. public function getBook( $intBookIndex )
  25. {
  26. if( array_key_exists( $intBookIndex, $this->arrCollection ) )
  27. {
  28. return $this->arrCollection[ $intBookIndex ];
  29. }
  30.  
  31. return null;
  32. }
  33.  
  34. public function getRandomBook()
  35. {
  36. if( count( $this->arrCollection ) > 1 )
  37. {
  38. shuffle( $this->arrCollection );
  39.  
  40. return $this->arrCollection[ 0 ];
  41. }
  42. }
  43.  
  44. public function addBook( $objBook )
  45. {
  46. if( $objBook instanceof Book )
  47. {
  48. $this->arrCollection[] = $objBook;
  49. return true;
  50. }
  51.  
  52. return false;
  53. }
  54.  
  55. public function setChaptersCount()
  56. {
  57. foreach( $this->arrCollection as $objBook )
  58. {
  59. $objBook->setChaptersCount();
  60. }
  61. }
  62. }
  63.  
  64. class Book
  65. {
  66. private $objCollection = null;
  67. private $strTitle  = '';
  68. private $intChaptersCount = null;
  69.  
  70. public function __construct( $strTitle )
  71. {
  72. $this->setTitle( $strTitle );
  73. }
  74.  
  75. public function getTitle()
  76. {
  77. return $this->strTitle;
  78. }
  79.  
  80. public function setTitle( $strTitle )
  81. {
  82. $this->strTitle = $strTitle;
  83. }
  84.  
  85. public function getChaptersCount()
  86. {
  87. if( ( $this->objCollection instanceof BooksCollection ) && $this->intChaptersCount === null )
  88. {
  89. $this->objCollection->setChaptersCount();
  90. }
  91.  
  92. return $this->intChaptersCount;
  93. }
  94.  
  95. public function setChaptersCount()
  96. {
  97. $this->intChaptersCount = rand( 1, 10 );
  98. }
  99.  
  100. public function assignToCollection( $objBooksCollection )
  101. {
  102. if( $objBooksCollection instanceof BooksCollection )
  103. {
  104. $this->objCollection = $objBooksCollection;
  105.  
  106. return true;
  107. }
  108.  
  109. return false;
  110. } 
  111. }
  112.  
  113. ?><pre><?php
  114.  
  115. $objBooksCollection = new BooksCollection();
  116.  
  117. echo print_r( $objBooksCollection );
  118.  
  119. $objBooksCollection->getRandomBook()->getChaptersCount();
  120.  
  121. echo print_r( $objBooksCollection );
  122.  
  123. ?></pre>


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 20:49