Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wielka tablica w obiekcie
Forum PHP.pl > Forum > PHP > Object-oriented programming
bigZbig
Mam pewne watpliwosci i chce sie upewnic.

Zalozmy ze klasa korzysta z wlasciwosci ktora jest tablica o ogromnych rozmiarach.
  1. <?php
  2. class klasaPrzykladowa
  3. {
  4. private $duzaTablica = array();
  5. protected $pojedynczaWartosc;
  6.  
  7. public function __construct() {
  8. //ta tablica jest sporych rozmiarow
  9. $this->duzaTablica = array('cos1', 'cos2', '...', 'cosX');
  10. }
  11.  
  12. public function cosSieDzieje($x) {
  13. //w zaleznosci od $x cos sie dzieje 
  14. //pojawia sie zmienna $y
  15. $this->pojedynczaWartosc = $this->duzaTablica[$y];
  16. }
  17. }
  18.  
  19. ?>

Zalozmy tez, ze w ciagu jednego wywolania strony generuje kilkadziesiat obiektow bedacych instancjami tej wlasnie klasy.

Czy kazdy obiekt tej klasy bedzie zawieral kopie tej duzej tablicy?

Czy wydzielenie tej tablicy na zewnatrz klasy pozwoli zaoszczedzic zasoby pamieci a jesli tak to czy Waszym zdaniem oplaca sie to przeprowadzic kosztem hermetyzacji.

  1. <?php
  2.  
  3. //ta tablica jest sporych rozmiarow
  4. $duzaTablica = array('cos1', 'cos2', '...', 'cosX');
  5.  
  6. class klasaPrzykladowa
  7. {
  8. protected $pojedynczaWartosc;
  9.  
  10. public function cosSieDzieje($x) {
  11. //w zaleznosci od $x cos sie dzieje 
  12. //pojawia sie zmienna $y
  13. $this->pojedynczaWartosc = $GLOBALS['duzaTablica'][$y];
  14. }
  15. }
  16. ?>

Wiem ze przyklad jest mocno hipotetyczny ale chodzilo jedynie o zobrazowanie problemu, ktory mnie nurtuje.

edit
----------------------
Poprawiono załóżmy i zamieniono global na $GLOBALS
mike
1. Wywal global. Tego powinno się zabronić.
2. Poszukaj informacji o wzorcu Singleton. Rozwiąże to Twój problem.
3. Załóżmy. Tak powinno to wyglądać. Popraw bo po oczach daje.
Radarek
Jesli wszystkie klasy maja zawierac ta sama tablice to nie musisz rezygnowac z hermetyzacji. Poczytaj o slowku kluczowym static w php.
bigZbig
@mike_mech Singelton nie rozwiazuje mojego problemu bo ja nie chce miec jednej instancji danej klasy tylko kilkadziesiat roznych obiektow. Kazdy z nich moze miec inna wartosc wlasciwosci $pojedynczaWartosc. Zbior wartosci jakie moze przyjac $pojedynczaWartosc jest ograniczona do elementow przechowywanych w tablicy $duzaTablica.

Problem w tym ze nie wiem co jest bardziej korzystne. Czy przechowywanie zbioru dopuszczalnych wartosci danej wlasnosci wewnatrz obiektu czy poza nim.

@Radarek - uprzedziles mnie, ale jesli dopuszczam mozliwosc zmiany tej tablicy to co jest lesze?
splatch
Myślisz w kategorii tablicy..? Tworzysz taką klasę jak na dole i problem z głowy - masz cały czas referencję i bez problemu "wczytujesz" obiekt w kilku miejscach dzięki singletonowi.
  1. <?php
  2. class ManyRecords implements Singleton, ArrayAccess, IteratorAggregate {
  3. /**
  4.  * @var array
  5.  **/
  6. protected $recors;
  7.  
  8. // implementacje interfejsow
  9. // singleton
  10. protected function __construct();
  11. public function getInstance();
  12.  
  13. // iterator aggregate
  14. public function getIterator();
  15.  
  16. // array access
  17. public function offsetGet($offset);
  18. public function offsetSet($key,$val);
  19. public function offsetUnset(offset);
  20. public function offsetExist(offset);
  21. }
  22. ?>
bigZbig
@splatch - nie odpowiedziales na moje pytanie (tzn. nie wprost), ale rozwiazales moj problem. Dzieki

@mike_mech - jesli to miales na mysli to zwracam honor
Radarek
Cytat(bigZbig @ 2006-02-08 16:25:31)
@Radarek - uprzedziles mnie, ale jesli dopuszczam mozliwosc zmiany tej tablicy to co jest lesze?

Pole bedace typu static ma ta wlasnosc ze jest wspolne dla kazdego obiektu klasy. Malo tego. Jest ono dostepne nawet jesli nie utworzyles jeszcze instancji klasy. Czy mozesz zmieniac je? Oczywiscie, ze tak. Wszystkie klasy widza jedna i ta sama zmienna. Jesli zmienisz cos w jednym obiekcie klasy to zmiany beda widoczne w kazdym innym obiekcie tej klasy.

Uwazam, ze powinienes uzyc tutaj jednak static smile.gif. Dlaczego? Singleton jest dobry jesli dany obiekt ma byc dostepny w wielu miejscach. Tutaj chcesz dostepu w jednym miejscu (klasie), dlatego static bedzie prostsze smile.gif.

Wybor nalezy do ciebie smile.gif.
bigZbig
Cytat(Radarek @ 2006-02-08 20:21:25)
Czy mozesz zmieniac je? Oczywiscie, ze tak. Wszystkie klasy widza jedna i ta sama zmienna. Jesli zmienisz cos w jednym obiekcie klasy to zmiany beda widoczne w kazdym innym obiekcie tej klasy.
Dlatego waham sie wlasnie czy uzyc static bo mowiac o zmianie mialem na mysli rozne wersje danej tablicy dla roznych obiektow. Jesli zmienie ksztalt tej tabeli przy tworzeniu obiektu nr 3 to nie chce aby to mialo wplyw na obiekt 1 i 2. Obawiam sie ze z tego samego powodu moze nie zadzialac Singleton, ale moze nie do konca rozumiem jego dzialania?

Tak czy inaczej zawsze moge jednak uzyc interfejsu Iteratora, obudowac tablice klasa i przekazywac obiekt tej klasy do mojej klasy.

Cytat(Radarek @ 2006-02-08 20:21:25)
Uwazam, ze powinienes uzyc tutaj jednak static smile.gif. Dlaczego? Singleton jest dobry jesli dany obiekt ma byc dostepny w wielu miejscach. Tutaj chcesz dostepu w jednym miejscu (klasie), dlatego static bedzie prostsze smile.gif.

Faktycznie planuje dostep tylko w jednej klasie dlatego jezeli zdecyduje sie na staly zestaw wartosci to uzyje static.
mike
Hmmm, a ja mam pytanie pomocnicze.
Bo ten problem nie do końca jest "z kosmosu" i jednak masz już jakąś potrzebę (tak sądzę)

Co w tej tablicay miałoby się znaleść?
Do czego chcesz ją stosować?

I dlaczego takich obiektów miałoby być tak wiele, a już pomijając to że tak wiele to dlaczego każdy musi kożystać z kopii tablicy, a zmiany mają być niewidoczne w pozostałych tablicach?
bigZbig
Pracuje nad klasa generujaca gradient. (narazie mam szybki zarys) Jak wiadomo gradient sklada sie z wielu kolorow, a kazdy kolor w moim projekcie to obiekt klasy Color. Obiekt koloru przechowuje jak sie mozna domyslic informacje o kolorze np. jego reprezentacje heksadecymalna, rgb i nazwe. I tu dochodzimy do sedna. Nazwy kolorow i ich odpowiedniki w formacie hex (html) przechowywane sa w tablicy. Tworzac obiekt koloru mozemy jako parametr przekazac kolor w formie skladowych rgb, html lub podajac jego nazwe

Moze ta tablica z nazwami nie jest znow az taka duza, ale kilkadziesiat pozycji w kazdej instancji obiektu Color to rzecz niepotrzebna.

Moglbym sie oczywiscie zadowolic polem static jak to juz Radarek mi podpowiedzial, ale ja rozwazam (narazie czysto teoretycznie) mozliwosc definiowania przez urzytkownikow wlasnych tablic kolorow.
  1. <?php
  2.  
  3. Zamiast domyslnej:
  4. $aColors = array(
  5. 'black' => '#000000', 
  6. 'red' => '#FF0000', 
  7. 'white' => '#FFFFFF',
  8. //itd.
  9. );
  10.  
  11. Zdefiniowana przez uzytkownika:
  12. $aColors = array(
  13. 'czarny' => '#000000', 
  14. 'czerwony' => '#FF0000', 
  15. 'bialy' => '#FFFFFF',
  16. //itd.
  17. );
  18.  
  19. ?>
Radarek
No to teraz wytlumacz, czemu chcesz niektore wartosci zmieniac, aby byly widoczne tylko w niektorych klasach?smile.gif Chcesz zeby w jednej klasie "red" oznaczalo kolor "ffffff" a w drugiej "red" kolor "000000"?smile.gif Chyba kolory powinny byc wspolne dla wszystkich klas?

EDIT:

Hm tak jeszcze na szybko (bo do konca nie rozumiem co chcesz osiagnac:) ). Mozesz zrobic jedna duza wspolna tablice (static) dla wsystkich klas (globalne kolory), oraz dodatkowo dodac zwyczajna tablice (nie static), w nim bedziesz trzymac indywidualne kolory (jak mniemam, duzo mniejszej od tej globalnej:)). Jak bedziesz szukac danego koloru to wpierw sprawdzisz czy jest w tej lokalnej (indywidualnej) tablicy, a potem ew. w tej globalnej (static).
bigZbig
@Radarek - przyznam sie ze ten pomysl ze zmienianiem ksztaltu tablicy powstal w duzej mierze na potrzeby tej dyskusji na zasadzie co by bylo gdyby. Akurat w przypadku mojej klasy niestandardowe nazwy kolorow to pomysl troszeczke wydumany.
akubiczek
Cytat(mike_mech @ 2006-02-09 10:30:36)
znaleść?
kożystać

Offtopicowo się wtrącę: znaleźć, korzystać - ortografie drogi! Nie pisałbym, ale sam wyżej zwróciłeś uwagę tongue.gif

Edit:

LOL, tak się zaczytałem że nie zwróciłem uwagi na datę wątku guitar.gif
bigZbig
Akurat ortografia jest aktualna winksmiley.jpg
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.