![]() |
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.
![]() |
![]()
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 |
|
|
![]() |
![]()
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.
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. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 31.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
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ą). 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ś. (...) 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). Ł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? (...) 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ć! 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. Ja uważam wręcz odwrotnie - bez rejestru ciężko utrzymac spójność interfejsu - np.
Dodajmy jeszcze że ten kod wygląda strasznie, w przeciwieństwie do:
(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) ) 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... 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. Pozdrawiam. Również pozdrawiam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował LEW21 21.07.2007, 23:04:07 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 8.10.2025 - 16:39 |