Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zasady pisania na forum Pro

Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.

> Rejestr vs Singleton vs global, co jest lepsze
LEW21
post
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 31.01.2007

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


Singleton to takie zmienne superglobalne, utrudniające dodatkowo podmianę pojedynczego komponentu systemu na inny. Jeżeli po prostu użyć zmiennych globalnych (albo nawet rejestru) można przypisać do danej zmiennej/pozycji instancję dowolnej klasy o dowolnej nazwie która ma po prostu określony API współpracujący z danym komponentem. Jeżeli jednak system używa Singletonu to nie jest to możliwe - konieczna jest albo modyfikacja danego komponentu albo utworzenie nowej klasy o nazwie takiej, jakiej rząda ten komponent.

Rejestr działa identycznie jak zmienne globalne, ale jest dużo mniej wygodny w obsłudze i na dodatek jest wolniejszy niż wbudowane w PHP zmienne globalne.

Zmienne globalne też jakimś idealnym rozwiązaniem nie są, ale lepszego po prostu w PHP nie ma. Dlatego właśnie ich używam.

@bim2 @BTW: tak

Ten post edytował LEW21 21.07.2007, 19:23:39
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Cysiaczek
post
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




@LEW21 - Odnoszę wrażenie, że nie widzisz zalet rejestru, bo mówisz jedynie o transportowaniu obiektów, czy innych danych (np. konfiguracyjnych). Rejestr ma tą przewagę nad gołymi zmiennymi globalnymi, ze można skutecznie zwiększyć jego funkcjonalność. Można np. składować obiekty jakiegoś konkretnego typu i nie trzeba za każdym razem sprawdzać - poprzez np. instanceof -, czy obiekt jest żadanego typu, czy nie. Tak samo z dodawaniem obiektów do rejestru - metoda dodająca (setter) może automatycznie sprawdzać typ przekazanego obiektu i umieścić w odpowiedniej kolekcji (zyskujemy kategoryzację), albo wręcz go wymusić w swojej definicji i wypluć wyjątek, gdy spróbujemy wprowadzić zły obiekt. Łatwo też sobie wyobrazić, że możemy kontrolować dostęp do obiektów, a nawet możemy filtrować, logować i wykonywac dziesiątki innych operacji, których nie zrobimy w podobnie łatwy i intuicyjny sposób z użyciem globali. Co do API; dlaczego uważasz, że rejestr nie jest przenośny? Ja uważam wręcz odwrotnie - bez rejestru ciężko utrzymac spójność interfejsu - np.
  1. <?php
  2. $registry->get('userAccountInfo', $user)->getAccountExpireDate(); // przekazujemy nazwę klucza i obiekt klasy User, //który posłuży do naszej identyfikacji
  3. ?>

Jako, że rejestr może z powodzeniem byc singletonem (bo jest wzorcem o szerszej defnicji, więc może składać się z innych wzorców), musisz jedynie pobrać jego instancję i wywołać określoną metodę. W Świecie, w którym niemal każda poważna aplikacja to swego rodzaju instancja jakiegoś frameworka - nie jest to wada, bo uczestniczy się w pewnej konwencji, więc dwie akcje nie będą używały róznych interfejsów - każda pobierze instancję rejestru i zrobi swoje.

Pozdrawiam.
Go to the top of the page
+Quote Post
LEW21
post
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 31.01.2007

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


Cytat(Cysiaczek @ 21.07.2007, 22:54:22 ) *
Można np. składować obiekty jakiegoś konkretnego typu i nie trzeba za każdym razem sprawdzać - poprzez np. instanceof -, czy obiekt jest żadanego typu, czy nie.

Tylko... po co to sprawdzać? Robiąc to z góry zakładasz że nigdy nikt nie będzie chciał po prostu podmienić tej klasy inną klasą o identycznym API, ale innej nazwie (żeby nie trzymać dwóch różnych klas pod tą samą nazwą).

Cytat(Cysiaczek @ 21.07.2007, 22:54:22 ) *
Tak samo z dodawaniem obiektów do rejestru - metoda dodająca (setter) może automatycznie sprawdzać typ przekazanego obiektu i umieścić w odpowiedniej kolekcji (zyskujemy kategoryzację), (...)

Tylko... po co kategoryzować obiekty w ten sposób? Nie potrzebujesz przecież kategorii np. "Klasy od sesji" bo z zasady używasz tylko jednej, a na pewno nie będziesz przez nie iterował i używał każdej z nich. A jeżeli chcesz np. kategoryzować w stylu "Użytkownicy, czyli instancje klasy User", "Moduły, czyli instancje klasy Module" itp. to dużo lepiej jest zrobić do tego dodatkowe klasy - Users i Modules - dzięki temu będziesz mógł za ich pomocą wygodnie pobierać danego usera/moduł/coś.

Cytat(Cysiaczek @ 21.07.2007, 22:54:22 ) *
(...) albo wręcz go wymusić w swojej definicji i wypluć wyjątek, gdy spróbujemy wprowadzić zły obiekt.

I w ten sposób uniemożliwić to o czym napisałem wcześniej (inna nazwa klasa, to samo API). No i przy okazji takie rozwiązanie zmusza programistę do zakodowania wszystkich typów klas i w rejestrze i w klasie głównej (tworzącej instancje tych klas).

Cytat(Cysiaczek @ 21.07.2007, 22:54:22 ) *
Łatwo też sobie wyobrazić, że możemy kontrolować dostęp do obiektów, (...)

Prawdę mówiąc nie wiem po co chcesz kontrolować dostęp do obiektów - jeżeli przypadkiem uruchomiony zostanie jakiś złośliwy kod to tak czy siak, niezależnie od tego typu kontroli, zrobi on spustoszenia. A po co kontrolować co może normalny kod?

Cytat(Cysiaczek @ 21.07.2007, 22:54:22 ) *
(...) a nawet możemy filtrować, logować i wykonywac dziesiątki innych operacji, których nie zrobimy w podobnie łatwy i intuicyjny sposób z użyciem globali.

Co ty znowu chcesz filtrować? (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) A logowanie - to fakt, nie możesz przy użyciu globali logować gdzie klasa została użyta, ale prawdę mówiąc nie widzę w takim działaniu sensu (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Loguje się gdy coś się stanie, np. gdy zostanie coś zmienione w bazie danych, ale nie np. pobranie klasy tylko po to żeby coś odczytać!

Cytat(Cysiaczek @ 21.07.2007, 22:54:22 ) *
Co do API; dlaczego uważasz, że rejestr nie jest przenośny?

A czy ja mówiłem coś na temat przenośności rejestru? Mówiłem tylko że nie widzę różnicy między globalami a rejestrem.

Cytat(Cysiaczek @ 21.07.2007, 22:54:22 ) *
Ja uważam wręcz odwrotnie - bez rejestru ciężko utrzymac spójność interfejsu - np.
  1. <?php
  2. $registry->get('userAccountInfo', $user)->getAccountExpireDate(); // przekazujemy nazwę klucza i obiekt klasy User, //który posłuży do naszej identyfikacji
  3. ?>

Dodajmy jeszcze że ten kod wygląda strasznie, w przeciwieństwie do:
  1. <?php
  2. global $user;
  3. $user->getAccountExpireDate();
  4. ?>

(zakładając że zrozumiałem o co Ci chodziło - nie jestem pewien, bo nie rozumiem co właściwie zrobiłeś, co dodatkowo pokazuje że użycie rejestru jest niezrozumiałe (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) )

Cytat(Cysiaczek @ 21.07.2007, 22:54:22 ) *
Jako, że rejestr może z powodzeniem byc singletonem (bo jest wzorcem o szerszej defnicji, więc może składać się z innych wzorców), musisz jedynie pobrać jego instancję i wywołać określoną metodę.

... co nie zmienia faktu że nie cierpię singletonów...

Cytat(Cysiaczek @ 21.07.2007, 22:54:22 ) *
W Świecie, w którym niemal każda poważna aplikacja to swego rodzaju instancja jakiegoś frameworka - nie jest to wada, bo uczestniczy się w pewnej konwencji, więc dwie akcje nie będą używały róznych interfejsów - każda pobierze instancję rejestru i zrobi swoje.

No tak, wrzućmy do aplikacji najlepiej dziesięć rejestrów i wogóle dziesięć zestawów frameworków, wtedy wszystko będzie idealnie działać!

Zakładając że się chce napisać w miarę szybki skrypt, widzę jedyne wyjście w ujednoliconym API a nie w kilku rejestrach.

Cytat(Cysiaczek @ 21.07.2007, 22:54:22 ) *
Pozdrawiam.

Również pozdrawiam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował LEW21 21.07.2007, 23:04:07
Go to the top of the page
+Quote Post

Posty w temacie
- LEW21   Rejestr vs Singleton vs global   21.07.2007, 19:22:47
- - Cysiaczek   @LEW21 - Odnoszę wrażenie, że nie widzisz zalet re...   21.07.2007, 21:54:22
|- - LEW21   Cytat(Cysiaczek @ 21.07.2007, 22:54:2...   21.07.2007, 23:02:21
- - x3m   CytatDodajmy jeszcze że ten kod wygląda strasznie,...   22.07.2007, 18:29:43
- - menic   A nie lepiej po prostu przekazywać to co nam potrz...   22.07.2007, 19:44:17
- - LEW21   x3m, jeżeli programista zna kod skryptu, to nie zr...   22.07.2007, 23:20:19
- - Turgon   LEW21, takie pomyłki wynikają bardzo często... bar...   23.07.2007, 09:46:27
- - kwiateusz   Lew przy Twoim założeniu każdy programista pracują...   23.07.2007, 12:29:02
- - LEW21   Kwiateusz, bo wygenerowanie jakiejś listy globali ...   23.07.2007, 13:26:49
- - thornag   Hmm niedawno zaczalem pracowac w zespole gdzie pop...   23.07.2007, 13:38:48
- - UDAT   Najpierw chwila polemiki: @LEW21 CytatMusiałbym pr...   23.07.2007, 14:13:08
- - LEW21   thornag, nie można przesadzać ani w jedną ani w dr...   23.07.2007, 20:21:20
|- - thornag   Cytat(LEW21 @ 23.07.2007, 20:21:20 ) ...   24.07.2007, 08:38:08
- - EuReKa   Cytat(thornag @ 24.07.2007, 09:38:08 ...   24.07.2007, 14:28:17
|- - Sedziwoj   Cytat(EuReKa @ 24.07.2007, 15:28:17 )...   24.07.2007, 20:06:45
|- - LEW21   Cytat(Sedziwoj @ 24.07.2007, 21:06:45...   25.07.2007, 00:15:44
- - Sedziwoj   @LEW21 Nie będę Cię przekonywał, życie to zrobi ja...   25.07.2007, 06:26:06
- - Turgon   Ja sam doszedłem do wniosku. Mam gdzieś wszystkie ...   27.07.2007, 16:58:57
- - Kodie   Osobiście wydaje mi się, że używanie zmiennych glo...   29.07.2007, 16:22:39
- - Athlan   Registry to swego rodzaju singletony zrobione z in...   21.08.2007, 16:10:14
- - zimi   zaczęło mnie ostatnio dręczyć jedno pytanie, jaka ...   23.08.2007, 15:19:58
- - NuLL   A wiesz jaka jest roznica pomiedzy metodami statyc...   27.08.2007, 18:49:06
- - msulik   Myślę, że zimiemu chodziło o Paamayim Nekudotayim ...   28.08.2007, 09:04:16
- - Cysiaczek   @msulik - to zależy, co kto woli. Nic jednak nie s...   28.08.2007, 10:11:37
- - zimi   @NuLL: ogólnie pojęcie "dynamiczne metod...   28.08.2007, 21:22:54
|- - MalCom   Cytat(zimi @ 28.08.2007, 22:22:54 ) s...   28.08.2007, 21:42:12
- - wrzasq   @zimi: w Javie nie ma zadnych przedrostkow przed z...   28.08.2007, 22:13:48
|- - MalCom   @wrzasq: Ale jakby nie patrzec sa az 3 operatory d...   28.08.2007, 22:24:11
- - zimi   Cytatw PHP musi byc wyraznie powiedziane, czy odwo...   28.08.2007, 22:33:59
- - Cysiaczek   Cytatmógłbyś rozwinąć? nie bar...   29.08.2007, 06:45:12
- - msulik   Cytat(zimi @ 28.08.2007, 22:22:54 ) @...   29.08.2007, 12:48:40
- - Sh4dow   Cytat... Czy ktoś może wie, jak się nazywa konstru...   4.09.2007, 14:07:53
- - zimi   CytatCos takiego mozna wykozystac jako magazyn, al...   5.09.2007, 20:44:42


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: 8.10.2025 - 16:39