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.

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Rejestr vs Singleton vs global, co jest lepsze
LEW21
post 21.07.2007, 19:22:47
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


--------------------
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL
Go to the top of the page
+Quote Post
Cysiaczek
post 21.07.2007, 21:54:22
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.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
LEW21
post 21.07.2007, 23:02:21
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ć? 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 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 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 smile.gif

Ten post edytował LEW21 21.07.2007, 23:04:07


--------------------
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL
Go to the top of the page
+Quote Post
x3m
post 22.07.2007, 18:29:43
Post #4





Grupa: Zarejestrowani
Postów: 18
Pomógł: 1
Dołączył: 23.01.2007
Skąd: Ostróda

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


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

Może to będzie pomocne:
  1. <?php
  2. global $user;
  3. $user->getAccountExpireDate();
  4.  
  5.  
  6. $user = 'udaje obiekt';
  7. $user.= 'i obsluguje publiczna metode "fatal error"';
  8. $user->getAccountExpireDate();
  9. /*
  10. Fatal error: Call to a member function getAccountExpireDate() on a non-object
  11. */
  12. ?>
Go to the top of the page
+Quote Post
menic
post 22.07.2007, 19:44:17
Post #5





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


A nie lepiej po prostu przekazywać to co nam potrzebne jako parametr funkcji tongue.gif


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
LEW21
post 22.07.2007, 23:20:19
Post #6





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

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


x3m, jeżeli programista zna kod skryptu, to nie zrobi czegoś takiego. A jeżeli nie zna, to niech nie próbuje go edytować tylko się z nim zapozna tongue.gif

menic, nie tongue.gif Musiałbym przekazać $filesystem (moja klasa dzięki której zabawa z systemem plików jest obiektowa i banalna tongue.gif), $activeUser, $output, $db (to taki przykład, osobiście z tego nie korzystam - trzymam dane w plikach XML) i jeszcze całą masę innych klas, a jak bym się pomylił w kolejności to skutki byłyby opłakane tongue.gif


--------------------
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL
Go to the top of the page
+Quote Post
Turgon
post 23.07.2007, 09:46:27
Post #7





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

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


LEW21, takie pomyłki wynikają bardzo często... bardzo często. Zwłaszcza kiedy kod pisze kilka osób.


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
kwiateusz
post 23.07.2007, 12:29:02
Post #8


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




Lew przy Twoim założeniu każdy programista pracujący nad projektem musiałby znać cały projekt na wylot, a przy dużych projektach gdzie linie kody liczy się w tysiacach albo lepiej to wdrożenie programisty trwałoby bardzo długo i było mało opłacalne bo zanim by sie nauczył wszystkich globali których nie może zakryć to jednak by trwało. A przy singletonie (nie jestem zwolennikiem rejestru do przekazywania instancji obiektu tylko do trzymania konkretnych danych) to bez problemu w każdym miejscu kodu moze stworzyć nowy obiekt bez zastanawiania i wtedy musi tylko znać klasy które sa mu potrzebne (jakie mają, api itp) i od razu może pisać, a nie sie zastanawiać czy nie zakrył globala czy nie, a przy błędach spowodowanych podmianą globala to już masakra doszukać się co spowodowało błąd bo te błędy nie są tak oczywiste jak inne... No i to pokazuje ze wystarczy ze zna tylko kawałek projektu nad którym pracuje a nie całość co przyspiesza wdrażanie nowych osób
Go to the top of the page
+Quote Post
LEW21
post 23.07.2007, 13:26:49
Post #9





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

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


Kwiateusz, bo wygenerowanie jakiejś listy globali których nie wolno nadpisać to tak wielki problem że aż trzeba się uciekać do innych, gorszych rozwiązań tongue.gif


--------------------
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL
Go to the top of the page
+Quote Post
thornag
post 23.07.2007, 13:38:48
Post #10





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


Hmm niedawno zaczalem pracowac w zespole gdzie poprzedni programisci doslownie wszystko robili na globalach.[ Teraz nawet jesli mialbytm liste na ktorej byloby powiedzmy tysiace globali myslisz ze sprawdzalbym takowa za kazdym razem gdy chce uzyc jakiejs zmiennej ?

Pozatym obecnie pracuje nad projektem ktory rozwijany jest juz od czterech lat (inna sprawa ze trzeba by go bylo poprostu przepisac) i widze w tym kodzie ktory uprzednio robilo n developerow setki globali wszedzie do wszystkiego. To jest niesamowicie trudne do wykrycia i ujarzmienia przy czym przez sprawdzanie co gdzie i jak zostalo zadeklarowane moja wydajnosc spada o jakies 80%

Global jak eval zly i koniec. Singleton jest juz lepszy aczkolwiek zdaniem wielu ostatnio jest to poprostu global w obiektowej panierce.

Registry wydaje sie najbardziej odpowiednim rozwiazaniem, chociazby dla tych samych argumentow ktore zostaly uprzednio wytoczone, mozna sledzic logowac debugowac o wiele wydajniej. I nie przemawia do mnie argument ze to debugowanie to mi jest potrzebne tylko w fazie dev. Co jesli klient sobie zarzyczy zmian ? Wtedy zaprzegam swoj zespol do wprowadzania tych zmian, jesli nie mieli by debuggowania juz jakos ogarnietego musieli by to robic jeszcze raz. A tak lekko i przyjemnie zmiana jednej flagi moga sobie wlaczyc i pomagac (ku uciesze naszej testerki tongue.gif).

Ogolnie uwazalem ze uzywanie globali umarlo wraz z php3, widac nie.

Dowodow na to ze global zly jest duzo wystarczy tylko poszukac i poczytac. Gdyby byl fajny to tak ogromny procent spolecznosci nie narzekalby na niego.

Dla mnie osobiscie (podejscie czysto pragmatyczne) argumenty za rozwiazaniami typu registry czy nawet singleton, i argumenty przeciw globalom sa oczywisne i jasne, jak najbardziej do mnie przemawiajace.

Tyle smile.gif


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
UDAT
post 23.07.2007, 14:13:08
Post #11





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

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


Najpierw chwila polemiki:
@LEW21
Cytat
Musiałbym przekazać $filesystem (moja klasa dzięki której zabawa z systemem plików jest obiektowa i banalna tongue.gif ), $activeUser, $output, $db (to taki przykład, osobiście z tego nie korzystam - trzymam dane w plikach XML) i jeszcze całą masę innych klas, a jak bym się pomylił w kolejności to skutki byłyby opłakane tongue.gif

Od czego jest type hinting?

@Cysiaczek
Cytat
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. ?>

A skąd pobierzesz instancję rejestru - z innego rejestru? Tworzenie specjalizowanych getterów i setterów spowoduje powstanie God Object(antywzorzec) i nie poprawia architektury aplikacji. Także zrobienie Fabryki rejestrów wydaje się trochę poronione, z których pobierałbyć odpowiedni rejestr.

Czyli coś takiego:
  1. <?php
  2. RegistryFactory::createRegistry()->getUserAccountInfo();
  3. ?>



Natomiast umożliwienie korzystania z setterów powoduje że mogę np. jakiejś klasie niechcący ustawić inny obiekt, który będzie miał to samo API, ale będzie to inna zupełnie instancja niezwiązana z poprzednią. Pomyśl np. o zmianie obiektu klasy MySQLSession na XMLSession (czy cokolwiek) w trakcie realizacji żądania.

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


Podejście dobre jedynie do uzyskiwania customizowanych obiektów, jedakże do samego rejestru jako takiego w rozumieniu podanym przez M.Fowlera w PoEAA już nie.



----------------------------------
Teraz moja propozycja:

Czy ten temat nie powinien nazywać się "Sposoby realizacji DI"?
Jeśli nie to nie ma chyba o czym rozmawiać:
global -> zło, Java, C# itd. radzą sobie dobrze bez.
singleton -> brak prawa bytu przy użyciu DI / lub rejestru
rejestr -> użycie jako prymitywny kontener DI (patrz komentarze powyżej) - nie należy mieszać konfigów z DI. Zamiast rejestru można użyć kontenera DI. Statyczne metody nie są rozszerzalne ( przed PHP6 i __callStatic). SingletonRegistry też nie jest rozwiązaniem, lepsza jest statyczna metoda fabryczna, jednak nie jestem zwolennikiem takiego rozwiązania.

W kolejnej odsłonie mojego frameworka chcę użyć normalnego kontenera DI w połączeniu z programowaniem aspektowym i adnotacjami - coś podobnego jak DI w EJB3:
  1. <?php
  2. class Foo {
  3. /**
  4.    * @Inject(type='Typ podstawowy', name='identyfikator')
  5.    */
  6.  private $injectedProperty;
  7.  
  8. /**
  9.    * @Inject(type='Typ podstawowy', name='identyfikator')
  10.    */
  11.  private function injectedSetter( $a ) {
  12.  
  13. }
  14. }
  15. ?>


Podobne podejście (annotacje) wykorzystywane jest, o ile pamiętam w PHP'owym frameworku Stubbles, jednak wymaga specjalnego tworzenia obiektów. Moja implementacja pozwalać będzie na transparentne użycie mechanizmu DI - parz. EJB3 - jednak jest to jeszcze kwestia dopracowania.
Go to the top of the page
+Quote Post
LEW21
post 23.07.2007, 20:21:20
Post #12





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

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


thornag, nie można przesadzać ani w jedną ani w drugą stronę tongue.gif Używanie globali wszędzie gdzie się da nie ma najzwyklejszego sensu - po co mi w mojej klasie xnOutput jakiś formularz stworzony przez jakiś kontroler. Trzeba używać ich z głową - wrzucić w nie najważniejsze komponenty, używane tak często że przekazywanie ich jako parametry nie ma sensu. (Chce Ci się przekazywać np. 10 dodatkowych parametrów każdej funkcji, szczególnie że nie koniecznie będzie z nich korzystać? Bo mi raczej nie. A natomiast zapamiętanie ich nazw żeby ich nie nadpisać to już nie jest problem.)

UDAT, prawdę mówiąc nie rozumiem tego co wymyśliłeś tongue.gif Po za tym chcę (i pewnie nie tylko ja) żeby moje skrypty działały na każdym hoście z PHP 5.2 i nie mam (tu też pewnie nie tylko ja) ochoty na prekompilację, więc AOP odpada.


--------------------
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL
Go to the top of the page
+Quote Post
thornag
post 24.07.2007, 08:38:08
Post #13





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


Cytat(LEW21 @ 23.07.2007, 20:21:20 ) *
[...](Chce Ci się przekazywać np. 10 dodatkowych parametrów każdej funkcji, szczególnie że nie koniecznie będzie z nich korzystać? Bo mi raczej nie. [...]


No wlasnie po to sa takie wzorce jak rejestr zeby nie trzeba bylo do metody przekazywac miliona argumentow.

Co do globali jeszcze to popatrz na to z innej strony, mamy zmienne superglobalne POST, GET, i teraz np ja zwyklem dodawac do propjektow komponent ktory na forum najczesciej nazywany jest HttpRequestem. Pelni on role swoistego proxy.

Zamiast bezposrednio odwolywac sie do tablic superglobalnych moge to zrobic poprzez metody dostepowe owego proxy, przy czym od razu moge sobie zazyczyc dane przefiltrowane, wyciapkowane czy jeszcze jakie tam sobie zazycze.

Sytuacja podobna jest przy rejestrze i zmiennych globalnych. Przyklad kompletnie wyssany z palca.

Powiedzmy ze mam ten sobie rejest i jakas metode dostepowa typu getObject, takze...

  1. <?php
  2. $oRegistry->getObj('DB', 'Interface_DB');
  3. ?>


I tutaj wlasnie zachodzi owo filtrowanie/sprawdzanie/etc zwracanych wartosci. Jesli np obiekt o ktory prosze zostal nadpisany przez jakis inny ktory w kolekcji siedzi pod tym samym kluczem i nie jest to instancja klasy implementujacej okreslony interfejs to od razu sie o tym dowiem, wyjatek, error cokolwiek.

Pewnie ze zaargumentujesz ze mozesz zrobic cos jak...
  1. <?php
  2. global $oDB;
  3. if(!$oDB instanceof Interface_DB) throw new Exception();
  4. ?>


Ale ja zasadniczo nie widze sensu powtarzania tych samych lini co chwile.

Biorac pod uwage ze i tak wiekszosc ubolewa nad brakiem kontroli typow zwracanych ktorej w phpie raczej nie bedzie, wzorce typu rejestr pomagaja w jakis sposob bardziej skonkretyzowany niz instrukcja warunkowa na jakas tam kontrole nad tymi typami.

Pozatym rozumiem stwierdzenie sztuka dla sztuki czy przerost formy nad trescia. Jesli buduje cos oparte na wzorcu np MVC i wykonuje to tak ze jak to ktos zauwazyl struklturalne kodowanie konczy sie na bootstrapie to nie widze sensu rezygnowac z obiektowych konwencji na rzecz na pierwszy rzut oka wygodniejszego globala.

Argument tutaj moze byc taki ze bede robil rejest tylko po to by zachowac wszystko w klasach i zeby pokozaczyc party.gif Otoz nie, dla mnie globale to zlamanie podstawowych zasad OOP jak chociazby oslabianie sprzegania czy hermetyzacja.

Podoba mi sie jeszcze jeden argument przytoczony powyzej, inni daja sobie rade bez globali wiec dlaczego w PHP ma byc inaczej ?

Global jak safe_mode czy register_globals wlasnie to jak dla mnie protezy niesione jeszcze z 3, to to co wyrabia PHP opinie jezyka w ktorym nie da sie porzadnie programowac, i ktorego uzywaja sami amatorzy, bo fakt jest faktem dla amatorow czy tzw 'bedroom warriors' uzycie globala jest po prostu szybsze i wygodniejsze, a jak pisalem amator taki nigdy nie bedzie mial stycznosci z projektem nad ktorym pracuje zespol powiedzmy 40 developerow.

Tyle uff ! :roll2:

Ten post edytował thornag 24.07.2007, 13:16:52


--------------------
"Wizja czasu jest szeroka, lecz kiedy sie przez nia przechodzi, czas staje sie waskimi drzwiami"

Go to the top of the page
+Quote Post
EuReKa
post 24.07.2007, 14:28:17
Post #14





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 22.07.2007

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


Cytat(thornag @ 24.07.2007, 09:38:08 ) *
Ale ja zasadniczo nie widze sensu powtarzania tych samych lini co chwile.

A ja zasadniczo nie widzę sensu sprawdzania tego w ogóle. Jeśli ktoś chce zepsuć program to zrobi to i z rejestrem, czy każdą inną niepotrzebnie przekomplikowaną metodą.
Cytat(thornag @ 24.07.2007, 09:38:08 ) *
Global jak safe_mode czy register_globals wlasnie to jak dla mnie protezy

global jest wymagane, gdyż w PHP zwraca zmienne tylko z obecnego zasięgu a nie z najbliższego jak ma to miejsce w C/C++.
Pomijam sens porównania dwóch nierozłącznych wzorców (w sensie możliwości ich jednoczesnego użycia) i części składni języka.
Go to the top of the page
+Quote Post
Sedziwoj
post 24.07.2007, 20:06:45
Post #15





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Cytat(EuReKa @ 24.07.2007, 15:28:17 ) *
A ja zasadniczo nie widzę sensu sprawdzania tego w ogóle. Jeśli ktoś chce zepsuć program to zrobi to i z rejestrem, czy każdą inną niepotrzebnie przekomplikowaną metodą.


Nie chodzi o psucie, ale o kontrolę, aby nie musieć ciągle czegoś sprawdzać, czy to jest to to, czy można z tego korzystać itp.
Takie struktury same pilnują raz się napisze, a potem jak wpadnie jakiś błąd (niechcący) to wiadomo gdzie i dlaczego.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
LEW21
post 25.07.2007, 00:15:44
Post #16





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

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


Cytat(Sedziwoj @ 24.07.2007, 21:06:45 ) *
Nie chodzi o psucie, ale o kontrolę, aby nie musieć ciągle czegoś sprawdzać, czy to jest to to, czy można z tego korzystać itp.

Powtarzam jeszcze raz: po co cokolwiek sprawdzać tongue.gif


Cytat(Sedziwoj @ 24.07.2007, 21:06:45 ) *
Takie struktury same pilnują raz się napisze, a potem jak wpadnie jakiś błąd (niechcący) to wiadomo gdzie i dlaczego.

Nadpisanie globala niechcący? Niechcący to można pomylić literę w jakiejś nazwie a nie nadpisać coś czego się wszędzie używa.


--------------------
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL
Go to the top of the page
+Quote Post
Sedziwoj
post 25.07.2007, 06:26:06
Post #17





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@LEW21
Nie będę Cię przekonywał, życie to zrobi jak zaczniesz coś większego robić.
Bo mam rażenie, że tego nie robiłeś.
Jeszcze tylko może apropo sprawdzania, bo to się robi aby działało tak jak się zakłada, czyli od tego aby działało, do tego aby ktoś coś nie kombinował (mówię teraz bardziej ogólnie).
Do tego jak coś zmieniasz, czy dopisujesz nowego nie trzeba ciągle czegoś sprawdzać, a to przyspiesza pisanie.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
Turgon
post 27.07.2007, 16:58:57
Post #18





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

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


Ja sam doszedłem do wniosku. Mam gdzieś wszystkie rejestry! To co trzeba przekazuje bezpośrednio do obiektu. Nie bawię się w takie rzeczy tongue.gif Trzeba wtedy pisać aplikację z pomysłem smile.gif Np. zrobić settera do fronta i ten doda to w postaci tablicy akcji. Kwestia gustu smile.gif


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
Kodie
post 29.07.2007, 16:22:39
Post #19





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 15.09.2006

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


Osobiście wydaje mi się, że używanie zmiennych globalnych _zwykle_ jest bezcelowe, poza tym zaczernia cały projekt aplikacji (wyjątki się zdarzają, ale rzadko). To czy użyć wzorca rejestru czy singletona czy choćby IoC (czy czy któryś dwóch) jest zależne od tego co dany obiekt ma robić, za co odpowiadać. Nie można z góry powiedzieć, że registry jest lepsze od singletona i odwrotnie (choćby dlatego, że dają różne możliwości i mają różne cechy). Wszystkich wzorców trzeba używać z rozwagą (choć zgodze się, że signleton jako jeden z najprostszych jest nadużywany), ale nie zgodzę się, że singleton sam w sobie jest czymś złym, bo widzę dla niego zastosowania, w których sprawdzi się doskonale.
Go to the top of the page
+Quote Post
Athlan
post 21.08.2007, 16:10:14
Post #20





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

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


Registry to swego rodzaju singletony zrobione z innych klas smile.gif Kiedyś o tym dość wyczerupjąco pisałem.

http://athlan.vgroup.pl/singleton-registry-map/


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.03.2024 - 10:45