Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wielka tablica w obiekcie, oszczednosc zasobow
bigZbig
post
Post #1





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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

Ten post edytował bigZbig 8.02.2006, 17:49:38
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Radarek
post
Post #3





Grupa: Zarejestrowani
Postów: 188
Pomógł: 0
Dołączył: 23.05.2005

Ostrzeżenie: (0%)
-----


Jesli wszystkie klasy maja zawierac ta sama tablice to nie musisz rezygnowac z hermetyzacji. Poczytaj o slowku kluczowym static w php.
Go to the top of the page
+Quote Post
bigZbig
post
Post #4





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


@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?

Ten post edytował bigZbig 8.02.2006, 17:28:16
Go to the top of the page
+Quote Post
splatch
post
Post #5





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował splatch 8.02.2006, 18:43:07
Go to the top of the page
+Quote Post
bigZbig
post
Post #6





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


@splatch - nie odpowiedziales na moje pytanie (tzn. nie wprost), ale rozwiazales moj problem. Dzieki

@mike_mech - jesli to miales na mysli to zwracam honor

Ten post edytował bigZbig 8.02.2006, 19:06:26
Go to the top of the page
+Quote Post
Radarek
post
Post #7





Grupa: Zarejestrowani
Postów: 188
Pomógł: 0
Dołączył: 23.05.2005

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .

Wybor nalezy do ciebie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post
bigZbig
post
Post #8





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .

Faktycznie planuje dostep tylko w jednej klasie dlatego jezeli zdecyduje sie na staly zestaw wartosci to uzyje static.
Go to the top of the page
+Quote Post
mike
post
Post #9





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
bigZbig
post
Post #10





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
Radarek
post
Post #11





Grupa: Zarejestrowani
Postów: 188
Pomógł: 0
Dołączył: 23.05.2005

Ostrzeżenie: (0%)
-----


No to teraz wytlumacz, czemu chcesz niektore wartosci zmieniac, aby byly widoczne tylko w niektorych klasach?(IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Chcesz zeby w jednej klasie "red" oznaczalo kolor "ffffff" a w drugiej "red" kolor "000000"?(IMG:http://forum.php.pl/style_emoticons/default/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).

Ten post edytował Radarek 9.02.2006, 11:45:56
Go to the top of the page
+Quote Post
bigZbig
post
Post #12





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


@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.
Go to the top of the page
+Quote Post
akubiczek
post
Post #13





Grupa: Zarejestrowani
Postów: 189
Pomógł: 0
Dołączył: 4.07.2004
Skąd: z neostrady

Ostrzeżenie: (0%)
-----


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ę (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Edit:

LOL, tak się zaczytałem że nie zwróciłem uwagi na datę wątku (IMG:http://forum.php.pl/style_emoticons/default/guitar.gif)

Ten post edytował akubiczek 25.04.2006, 22:27:04
Go to the top of the page
+Quote Post
bigZbig
post
Post #14





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Akurat ortografia jest aktualna (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

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: 20.12.2025 - 18:15