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.

5 Stron V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Wzorce projektowe, coto, poco, dlaczego
Cysiaczek
post 5.12.2008, 23:41:46
Post #21





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




@Kocurro - nie żebym się czepiał, ale Singleton to Singleton, a nie klasa statyczna happy.gif


--------------------
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
Kocurro
post 5.12.2008, 23:45:32
Post #22





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

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


Cysiaczek - singleton to wzorzec projektowy ... prawda questionmark.gif

A klasa statyczna może stanowić implementację tego wzorca w PHP ...

Wzorzec to nie implementacja ... właśnie dlatego wzorce są takie cool i trendy bo nie mają ściśle ustalonej implementacji - są w pewnym sensie czarnym pudełkiem, które ma robić coś co jest określone a nie jest określone dokładnie jak ma to robić. I Ty jako programista masz tak wymyślić co w tym czarnym pudełku jest by ono było jak najlepszym czarnym pudełkiem ...

i jeśli wolisz:

  1. <?php
  2.  
  3. $Config->getInstance()->load( 'config.ini' );
  4.  
  5. $Config->getInstance()->getValue( 'zmienna' );
  6. ?>


to proszę bardzo - ja wolę jednak czasem mieć mniej znaczków bo nie zawsze ich duża ilość jest dobra.

Pozdr.
Go to the top of the page
+Quote Post
Cysiaczek
post 6.12.2008, 03:11:12
Post #23





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




Klasa statyczna nie jest implementacją Singletona i nigdy nie będzie. Istotą tego wzorca nie jest dostęp do danych, tylko istnienie jedynej instancji danego obiektu w systemie.

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
chlebik
post 10.12.2008, 10:29:28
Post #24





Grupa: Zarejestrowani
Postów: 113
Pomógł: 5
Dołączył: 12.09.2006
Skąd: Pruszków/Warszawa

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


Cysiaczek dobrze mowi. Dla informacji - ostatnie spotkanie Warszawa Design Patterns Group było poświęcone singletonowi:

Materiały z tego spotkania


--------------------
"Człowiek dążący do swego celu może być skuteczny tylko w przypadku, jeśli każdą minutę swego życia wykorzysta z maksymalną korzyścią dla osiągnięcia zaplanowanego celu. Jeśli stworzył dla siebie system kar i karze sam siebie za każdą zmarnowaną minutę. Człowiekowi w zupełności wystarczą 3-4 godziny snu, cały pozostały czas może być wykorzystany dla osiągnięcia upragnionego celu." -- Wiktor Suworow
Java devBlog
KulturalnyChlebik
Go to the top of the page
+Quote Post
nasty
post 27.12.2008, 07:25:34
Post #25





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Osobiście, bardzo nie lubie wzorca Singleton i uważam go za anty wzorzec. W swoich projektach staram sie omijać jego użycie szerokim łukiem, zastępując go wieloma bardziej nadającymi sie wzorcami/pomysłami, takimi jak Chain-of-responsibility lub/i przekazywaniem objektu kontekstowego dalej. Jestem prawie pewny, że w każdej aplikacji można wyeliminować wszystkie użycia Singletona bez uszczerbku na czytelności kodu bądź jasności architektury a wręcz przeciwnie - projekt staję się bliższy naturalnemu myśleniu i łatwiejszy w debugowaniu.

Ten post edytował nasty 27.12.2008, 07:34:09
Go to the top of the page
+Quote Post
qbatoja
post 5.01.2009, 18:44:12
Post #26





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 3.05.2005

Ostrzeżenie: (10%)
X----


w domu mam jeden piec do ogrzewania. zeby uzyskac cieplo w moim pokoju, nie potrzebuje zamawiac drugiego, tylko "odczytam" gaz z tego jednego.
ja tak rozumiem singleton ;]
Go to the top of the page
+Quote Post
nasty
post 6.01.2009, 16:47:18
Post #27





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


... albo przekaze gaz z jednego smile.gif
Go to the top of the page
+Quote Post
starach
post 7.01.2009, 23:03:16
Post #28





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


  1. <?php
  2. class DRA_Engine
  3. {
  4.    private static $cfg;
  5.    private static $loader;
  6.    private static $output;
  7.    private static $router;
  8.    private static $template;
  9.    private static $website;    
  10.  
  11.    public function __construct();
  12.    public function init();
  13.    public function finalize();
  14.    
  15.    public static function config();
  16.    public static function loader();
  17.    public static function output();
  18.    public static function router();
  19.    public static function template();
  20.    public static function website();
  21. }
  22. ?>
Tak wygląda klasa główna mojego FW. ( Pominąłem implementacje metod i komentarze )
Teraz pytanie. Registry i singleton zło mówicie. Dlaczego? W konstruktorze mam przypisanie do pól składowych obiektów które pobieram przez getInstance(). Po prostu każda z tych 6 klas implementuje Singleton. Nie bardzo wiem co tutaj jest złe.
Go to the top of the page
+Quote Post
markac
post 7.01.2009, 23:12:57
Post #29





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 23.02.2005

Ostrzeżenie: (10%)
X----


Wszystko laugh.gif
Go to the top of the page
+Quote Post
starach
post 7.01.2009, 23:46:54
Post #30





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


To żeś mnie nawrócił na Context biggrin.gif

Miałem jakoś tutaj uzasadnić użycie lub nieużywanie Contextu ale jakoś nic mi do głowy nie przychodzi.
Koronnym argumentem przeciwko takiemu sposobowi używania klas jest Hermetyzacja. Chyba wszyscy jesteśmy zgodni że tak na prawdę można ją złamać na dziesiątki sposobów i pakowanie wszystkie w obiekty kontekstu tak na prawdę guzik da. Więc na dobrą sprawę wszystko sprowadza się do wygody użytkowania. Czy w waszych kontekstach macie oddzielne metody do pobierania ściśle określonych obiektów? W przykładach widzę tylko metody get i set które mogę śmiało porównać do ubogiej wersji wzorca Registry, z tą różnicą że nie jest on statyczny tylko przekazywany ręcznie do konkretnych obiektów.

Projektując swój silnik doszedłem do wniosku że nie ma potrzeby tworzyć kilku instancji takich samych obiektów gdyż może to powodować nietypowe zachowanie całej aplikacji o zwykłym spadku wydajności nie wspominając. Wystarczy mi jeden obiekt Template tylko udoskonalony o obsługę sesji. Output też jeden powinien być. Bo co mi z danych umieszczonych w klasie które nie zostaną przetworzone.
Według mnie w takiej sytuacji Singleton jest jak najbardziej na miejscu. Konstruktor na private i mam tylko jedną instancję danej klasy w całym systemie. Nie muszę trząść portkami że będę kilka godzin debugował całą aplikację bo utworzę kilka obiektów, klasy która powinna mieć jeden obiekt.
Go to the top of the page
+Quote Post
wrzasq
post 8.01.2009, 02:54:52
Post #31





Grupa: Zarejestrowani
Postów: 206
Pomógł: 18
Dołączył: 6.03.2006
Skąd: Szczecin

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


W twoim przypadku singletony są bez sensu i na pewno burzą kod. Skoro masz taką klasę... hmm.. rejestru? kontekstu? (co w kontekście robią metody statyczne, albo w rejestrze dynamiczne?) to nie potrzebujesz singletonów w poszczególnych klasach. Instancje zasobów tworzysz w czasie inicjalizacji silnika, więc po co im singletony? Tworzysz je przez new i przechowujesz, w systemie pobierasz z tego obiektu. Więc singleton mija się z celem. Albo korzystaj z 6 singletonów wszędzie, albo twórz sobie te zasoby w twojej klasie. Chyba raczej proste - skoro masz singleton to po cholerę pobierać go przez rejestr/kontekst - jak już tak mówisz o "zwykłej wydajności" to to jest dokładnie niepotrzebny narzut.


--------------------
Go to the top of the page
+Quote Post
starach
post 8.01.2009, 05:18:20
Post #32





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Rejestr dla wygody, natomiast Singleton jako uniemożliwienie utworzenia więcej niż jednej instancji danej klasy. Każda singletonowa klasa ma konstruktor ustawiony na prywatny, więc w przypływie nagłej weny twórczej nie zrobię dwóch instancji DRA_Output. Co mogłoby mieć zgubne skutki.

init() i finalize() używam w index.php. Jako że nie są to gettery chciałem je jakoś odróżnić, więc nie robiłem z nich metod statycznych.
W indeksie jest tworzony obiekt DRA_Engine. Konstruktor przypisuje obiekty do pól składowych init() uruchamia ładowanie i parsowanie konfiguracji a finalize() składa wszystkie elementy do kupy i wypluwa użytkownikowi.

Ten post edytował orglee 8.01.2009, 05:19:24
Go to the top of the page
+Quote Post
LBO
post 8.01.2009, 09:01:43
Post #33





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Prawda jest taka, że przy kontekście w ogóle nie potrzeba oprogramowanych Singletonów tylko tworzysz je na żądanie

Podam na przykładzie fabryki modelu (przemaksymalnie uproszczony, bez niuansów):

  1. <?php
  2. public function getModel($name, $module, array $parameters)
  3. {
  4.    // ustalamy nazwę klasy i zapisujemy do $class
  5.  
  6.    if(!class_exists($class)) {
  7.        throw new Exception('Model does not exist.');
  8.    }
  9.  
  10.    $rc = new ReflectionClass($class);
  11.    if($rc->implementsInterface('ISingletonModel')) { // może też być jakiś uniwersalny interfejs Singleton
  12.        // tutaj pobiera istniejący już obiekt z tablicy instancji lub jeżeli go nie ma tworzy nowy i zapisuje do tej tablicy.
  13.    } else {
  14.        // tworzy nowy obiekt dla modelu i inicjujemy.
  15.    }
  16.    return $modelInstance;
  17. }
  18. ?>
Go to the top of the page
+Quote Post
starach
post 8.01.2009, 11:17:28
Post #34





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Jak mniemam w komentarzu metody po @return jest podana nazwa klasy abstrakcyjnej po której dziedziczą modele lub ewentualnie interfejs. No i tutaj już widać różnice w sposobie stosowanych przez nas rozwiązań. Też konstruuję takie metody które nazywam akcesorami / geterami ale nie przyrównuję ich do kontekstu. Druga sprawa to sprawdzanie implementowanych interfejsów.
  1. <?php
  2. $rc = new ReflectionClass($class);
  3.   if($rc->implementsInterface('ISingletonModel')) { // może też być jakiś uniwersalny interfejs Singleton
  4.       // tutaj pobiera istniejący już obiekt z tablicy instancji lub jeżeli go nie ma tworzy nowy i zapisuje do tej tablicy.
  5.   }
  6. ?>


  1. <?php
  2. if(DRA_Class::doesImplements(obiekt lub nazwa klasy, 'nazwa interfejsu'))
  3. {
  4.  
  5. }
  6. ?>
Możesz mówić że wynajduję koło od nowa pisząc własną implementację, ale dla mnie ten zapis jest czytelniejszy. A przy ponad 400 linijkach na klasę ( licząc PHPDoc ) robi to już sporą różnicę.
Go to the top of the page
+Quote Post
LBO
post 8.01.2009, 11:47:07
Post #35





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


1. Tak sadzę, że wynajdujesz koło na nowo smile.gif

2. Po @return jest AgaviModel, ale ostatnio rezygnuje z modeli przywiązanych do frameworka i robię na czystych obiektach PHP. Kod jest bardziej przenośny.

3. Moim zdaniem pobieranie modelu leży w gestii kontekstu.
Go to the top of the page
+Quote Post
nasty
post 9.01.2009, 23:34:17
Post #36





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

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


Cytat
Druga sprawa to sprawdzanie implementowanych interfejsów.
a instanceof?
Go to the top of the page
+Quote Post
pinochet
post 11.01.2009, 01:06:04
Post #37





Grupa: Zarejestrowani
Postów: 120
Pomógł: 12
Dołączył: 9.10.2008
Skąd: Tricity.Rumia()

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


Witam chciałbym się przyłączyć do dyskusji.
Otóż tak jak Kocurro uważam iż implementacją singletonu jest klasa statyczna ... kto powiedział że ona nie ma instancji? to jest rzecz czysto abstrakcyjna - możemy założyć że ma jedną niepowtarzalną instancję do której programista nie ma poprostu dostępu, każdy dowód na to ( a przynajmniej nie przychodzi mi nic do głowy teraz) że klasa statyczna nie jest singletonem mozna skierowac przecikwo "singletonowi z jawną instancją". Gdzieś kiedyś czytałem że singleton to poprostu obejście braku klas abstrakcyjnych w php 4.
Jeżeli kody takie jak ten zaprezentowany przez orglee #28 mają dowodzić potrzeby zastosowania Singletonu to nie mamy o czym rozmawiać. Przypisanie instancji do zmiennej statycznej i odwoływanie się do tychże singletonów przez klasę główną nie ma żadnego sensu(w sensie singletonowym ;] ). Zaryzykuję stwierdzenie, że aplikacja ta nie wykorzystuje wogóle wzorca singleton aczkolwiek może go implementować.(wniosek ... )
A do eliminacji pomyłek to polecam coś takiego:
  1. <?php
  2. class Niby_ze_potrzebuje_singletonu{
  3.    private static $flaga = 0;
  4.    function __construct(){
  5.      if(self::$flaga) throw new Exception("mea culpa, mea maxima culpa, najpierw projekt potem implementacja.");
  6.      self::$flaga = 1;
  7.    }
  8. }
  9. ?>
Go to the top of the page
+Quote Post
starach
post 11.01.2009, 14:08:38
Post #38





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Jak najbardziej masz racje nasty. Zapomniałem tylko dodać że drugi parametr u mnie jest tablicą i zwyczajnie sprawdzam czy kilka interfejsów implementuje dany obiekt. Dobra ale zostawmy ten temat już.

Tak się w sumie zastanawiam nad waszym sposobem interpretacji Context'u. Wertując kod Symfony zatrzymałem się chyba na parsowaniu plików konfiguracyjnych i olałem ten framework ( powody pozwolę sobie zostawić na jakiś inny moment żebyśmy nie zbaczali z tematu ), więc na dobrą sprawę Contextu jako takiego, to ja tam specjalnie nie widziałem. wrzasq ma zapewne racje ze swoim zdziwieniem oglądając moją hybrydę rejestru, singletona i hmm contextu? Może żeby wyjaśnić zawiłości związane z tym tematy i mój brak specjalnego obeznania z tym wzorcem, ktoś machnąłby jakiś "życiowy" przykład jego wykorzystania. No tak z grubsza chociaż żeby można było poznać jego zalety. Wzrokowiec i słuchowiec, bo zdaje mi się że tutaj leży mój problem ze zrozumieniem o co wam chodzi.

p.s. Wywalam gettery. DRA_Engine będzie tylko inicjalizował obiekty silnika a nie przechowywał je celem pobrania.
Go to the top of the page
+Quote Post
Cysiaczek
post 11.01.2009, 21:14:04
Post #39





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




Cytat
Gdzieś kiedyś czytałem że singleton to poprostu obejście braku klas abstrakcyjnych w php 4.

To się na humor nadaje tylko smile.gif

Jedno zdanie burzy Twoją argumentację:
Obiekt posiada tożsamość, klasa statyczna nie.
To jest różnica jak w reklamie Żywca smile.gif

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
qba_rox
post 12.01.2009, 01:20:52
Post #40





Grupa: Zarejestrowani
Postów: 29
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Warszawa

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


Cytat(pinochet @ 11.01.2009, 00:06:04 ) *
Otóż tak jak Kocurro uważam iż implementacją singletonu jest klasa statyczna ... kto powiedział że ona nie ma instancji? to jest rzecz czysto abstrakcyjna - możemy założyć że ma jedną niepowtarzalną instancję do której programista nie ma poprostu dostępu, każdy dowód na to ( a przynajmniej nie przychodzi mi nic do głowy teraz) że klasa statyczna nie jest singletonem mozna skierowac przecikwo "singletonowi z jawną instancją".


No to sie mylisz brachu i powiem Ci dlaczego.

Klasa jest tylko pewna struktura, opisem zachowywania sie obiektow i zadna (nawet najmniejsza ;p) jej instancja nie jest alokowana w pamieci. Gdyby mozna bylo dodac dyrektywe static przed nazwa klasy, to wtedy prawdopodobnie mozna byloby tak powiedziec. Idac dalej, pola statyczne w klasie sa inicjalizowane w pamieci, dlatego mozesz na nich operowac. A klasa wtedy jest tylko takim interfejsem dostepu do tych danych. Poza tym, wg definicji, tworzac obiekt, tworzysz instancje, w zadnym innym wypadku. W pamieci jest tylko przechowywana jej struktura, bys ty sam ta instancje mogl powolac.

A skoro instancje, programista moze powolac tylko tworzac nowy obiekt, singleton znaczy nie inaczej niz, pozwolenie na stworzenie tylko jednego obiektu. Poza tym dzieki temu ze jest to obiekt, mozesz go np serializowac i zapisac w cachu, klasy (tej niby statycznej) nie zserializujesz. Nic z nia nie zrobisz. mozesz tylko (powtorze sie) przez nia uzyskac dostep do blokow pamieci (pola statyczne).

Dlaczego singleton nie jest antywzorcem? Przykladem jest sesja. moze byc tylko jedna. Nie mozemy wiec pozwolic na tworzenie wiecej niz jednego obiektu sesji, bo to mogloby miec fatalne skutki, np zniszczeniem danych sesyjnych. No i oglnie rzecz biorac, Sesja jest jedna, wiec jak moze byc reprezentowana przez kilka obiektow?

Pozdrawiam

Ten post edytował qba_rox 12.01.2009, 01:30:47


--------------------
Kodzimy!!!
Go to the top of the page
+Quote Post

5 Stron V  < 1 2 3 4 > » 
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 - 12:52