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 5 >  
Reply to this topicStart new topic
> Wzorce projektowe, coto, poco, dlaczego
pinochet
post 12.01.2009, 22:20:25
Post #41





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

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


Jeśli chodzi o serializację - można to oczywiście obejść ale jeśli chodzi o wygodę to może racja że lepiej singleton, aczkolwiek dalej twierdzę, że stosowanie wyżej wymienionych jest następstwem niechlujnego projektowania aplikacji. BTW po co serializować klasę łączącą z bazą danych?.
Co do php4 to się nie znam ... miałem przerwę między wersjami 3 i 5 :]
Chyba rzeczywiście z siebie głupka zrobiłem wstydnis.gif ...
Go to the top of the page
+Quote Post
wrzasq
post 13.01.2009, 05:57:57
Post #42





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

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


Cytat
dalej twierdzę, że stosowanie wyżej wymienionych jest następstwem niechlujnego projektowania aplikacji

bo zes sobie ubzdural, ze singleton to jakies "obejscie z PHP4" albo tylko i wylacznie "zamiennik dla rejestru/kontekstu/klasy statycznej". na tym polega istota singletonu wlasnie, ze udostepnia on instancje (obiekt) danej klasy i pozawala na istnienie TLYKO JEDNEJ takiej instancji. nie chodzi o przekazywanie go w jakis niejawny sposob, tylko o zapobieganie tworzenia wiecej niz jeden instancji klasy, ktora nie powinna miec ich tyle. to jest istota singletonu.


--------------------
Go to the top of the page
+Quote Post
LBO
post 19.04.2009, 10:14:00
Post #43





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

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


Dorzucę swoje 0,02zl

Singleton nie jest złym wzorcem. Ma swój sens i cel. Niestety implementacje, które są propagowane w światku PHP (ten z getInstance()) kuleją bardzo z powodu niewrażliwości na kontekst wywołania i zafałszowania (narzuca obiektowi działanie niezgodne z jego dziedziną). Robią się z Tego takie globale. Wspomniał ktoś tutaj, że hermetyzacje (każdej aplikacji) można złamać na wiele sposobów. Trudno się z tym nie zgodzić, ale czy to powód, że od samego początku, że się tak wyrażę kolokwialnie, srać sobie w kodzie?

Bardzo ładnie radzą sobie frameworki, chociażby, Javowe używając prześwietnych kontenerów IoC. To one załatwiają sprawę singletona, więc pisząc obiekt nie zastanawiasz się, czy ma być singletonem (separation of concerns), czy nie. I nie natkniesz się na problem przy testowaniu takiego obiektu smile.gif Bo testability leci pod sufit wtedy.

Ten post edytował LBO 19.04.2009, 10:14:38
Go to the top of the page
+Quote Post
nasty
post 23.04.2009, 03:04:47
Post #44





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

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


Cytat(qba_rox @ 12.01.2009, 02:20:52 ) *
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?
Pozwolę sobie nie zgodzić się i wyprowadzić Cie z błędu przy okazji winksmiley.jpg

Załóżmy, że klasa Session jest klasą która opisuję sesję. Tworzona jest tylko raz, na początku działania frameworku, następnie przekazywana do Request, następnie, Controller i potem do Response.

Jak widać masz jedną klasę, która ma swoje określone workflow, wiadomo w jakiej kolejności co i jak ma do niej dostęp - w taki sposób, że możesz narysować diagram "podań" ten klasy. Czy taki model nie jest dużo czytelniejszy niż singleton?

I teraz rozważmy możliwość tworzenia nowych instancji Sessji, gdzie wiemy, że sesja jest tylko jedna.

Jak to bywa z obiekatmi kontekstowymi, są one przekazywane w parametrach metod do kolejnych klas, i nawet jak utworzysz nowy obiekt klasy Session, to on i tak będzie pusty a spopulowany danymi obiekt będzie tylko ten który był w parametrze - więc jaki problem? imho, żaden.

Za używanie Singletonów powinni bić po mordzie i tyle tongue.gif
Go to the top of the page
+Quote Post
nasty
post 23.04.2009, 11:53:29
Post #45





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

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


Cytat(guitarnet.pl @ 23.04.2009, 05:23:11 ) *
@nasty
tak wlasnie programuja w microsofcie (...)
Potraktuję to jako komplement winksmiley.jpg
Go to the top of the page
+Quote Post
qba_rox
post 1.05.2009, 13:59:11
Post #46





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

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


@nasty
Pozwole sobie odpisac smile.gif

Smiem poddac w watpliwosc twoje zrozumienie singletonu. Singleton nie definuje ci jak ma przebiegac workflow obiektu. Chodzi tu o nic innego, jak tylko o mozliwosc powolania jednej instrancji. Sesja jest z definicji bytem takim jak np u czlowieka swiadomosc. Mozesz miec tylko jedna i nie mozesz miec drugiej chocby byla pusta winksmiley.jpg
Wiec nie mozesz nawet pozwolic na utworzenie obiektu, bo jest to poprostu nie zgodne z logika. Sa pewne byty, ktore nie moga byc traktowane jak np myszka od komputera, ktorej "objekt" w fabryce myszek jest "tworzony" wielokrotnie winksmiley.jpg

A wracajac do twojego workflow, to co stoi na przeszkodzie dac dostep do metody 'getInstance()' tylko raz? Mam na mysli, ze jesli obiekt jest juz powolany, to getInstance zeby zwracala null winksmiley.jpg i nikt nie bedzie wtedy traktowal jej jako global i zachowasz swoj magiczny workflow, ktory prawdopodobnie jest spoko i ma duzo sensu w sobie tongue.gif

btw. nie jestem fanem traktowania singletonu jako ominiecia zmiennych globalnych winksmiley.jpg


--------------------
Kodzimy!!!
Go to the top of the page
+Quote Post
nasty
post 1.05.2009, 20:34:53
Post #47





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

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


Drogi @qba_rox, zauważ jednak, że takie uniemożliwianie wykonania getInstance() więcej niż jeden raz, jest już takjakby hackiem singletona, a to samo masz w obiekcie kontekstowym, on jest przekazywany tylko raz.

Załóżmy taką sytułację, że w pewnym momencie chciałbyś odtworzyć pewną sesję - np. masz aplikację z opcją "zapisz sesję" i po ponownym uruchomieniu, chciałbyś, żeby wszystko było jak po zamknięciu. Singleton Ci na to nie pozwoli, gdyż możesz tylko uzyskać obiekt który jest tworzony w ukrytym konstruktorze, nie możesz odtworzyć stan zachowanego (załóżmy, że zserializowanego) obiektu do tej ukrytej instancji, zachowanej w Singletonie. A z obiektem kontekstowym można takie coś zrobić.

A odnośnie świadomości... wydaję mi się, że za bardzo puściłeś wodzę fantazji przyrównując ją do sesji, bo jak wspomniałem, sesję można zachować, nie używać jej a następnie odtworzyć a świadomość nie, no chyba, że mówimy tu o bardzo zakrapianej alkoholem imprezie winksmiley.jpg
Go to the top of the page
+Quote Post
qba_rox
post 2.05.2009, 10:15:35
Post #48





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

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


Cytat(nasty @ 1.05.2009, 20:34:53 ) *
Drogi @qba_rox, zauważ jednak, że takie uniemożliwianie wykonania getInstance() więcej niż jeden raz, jest już takjakby hackiem singletona, a to samo masz w obiekcie kontekstowym, on jest przekazywany tylko raz.

Nie, nie jest hackiem. nadal pozwala ci powolac obiekt tylko raz, a to jest definicja singletona.


Cytat(nasty @ 1.05.2009, 20:34:53 ) *
Załóżmy taką sytułację, że w pewnym momencie chciałbyś odtworzyć pewną sesję - np. masz aplikację z opcją "zapisz sesję" i po ponownym uruchomieniu, chciałbyś, żeby wszystko było jak po zamknięciu. Singleton Ci na to nie pozwoli, gdyż możesz tylko uzyskać obiekt który jest tworzony w ukrytym konstruktorze, nie możesz odtworzyć stan zachowanego (załóżmy, że zserializowanego) obiektu do tej ukrytej instancji, zachowanej w Singletonie. A z obiektem kontekstowym można takie coś zrobić.

Jesli chcesz zastosowac swoj workflow, to oboje wiemy ze nie ma problemu, natomiast jesli chcemy miec dostep do sesji z kazdego miejsca aplikacji, to wtedy masz racje. jest to problem, ale do obejscia. wystorczy dodac metody, extract i populate tongue.gif

Cytat(nasty @ 1.05.2009, 20:34:53 ) *
A odnośnie świadomości... wydaję mi się, że za bardzo puściłeś wodzę fantazji przyrównując ją do sesji, bo jak wspomniałem, sesję można zachować, nie używać jej a następnie odtworzyć a świadomość nie, no chyba, że mówimy tu o bardzo zakrapianej alkoholem imprezie winksmiley.jpg

Hehhehe, dobre. Chocidzlo mi tu bardziej o byt smile.gif


--------------------
Kodzimy!!!
Go to the top of the page
+Quote Post
Cysiaczek
post 10.05.2009, 00:12:16
Post #49





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




@nasty - a co jeśli obiekt, który tworzymy, dokonuje przy własnej konstrukcji zadania wpływające na resztę systemu, czy choćby dane?

  1. <?php
  2. class Ping
  3. {
  4.    public function __construct(VeryImportantLogger $oLogger)
  5.    {
  6.        $oLogger->log(__CLASS__);
  7.    }
  8. }
  9.  
  10. class LogAnalyzer
  11. {
  12.    public function pong(VeryImportantLogger $oLogger)
  13.    {
  14.        if(oLogger->hasMany('Ping'))
  15.        {
  16.            $this->callAlert();
  17.            die();
  18.            exit();
  19.            burnDisk('C:'); // tongue.gif
  20.        }
  21.    }
  22. }
  23. ?>


--------------------
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
nasty
post 13.05.2009, 07:58:52
Post #50





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

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


@Cysiaczek, robi to samo, tyle, że na początku swojej podróży (workflow).

A nawet nie koniecznie na początku, może nawet w środku. Z tym, że mając to ładnie ułożone w workflow, wiemy dokładnie w której fazie aplikacji wszystko się dokonuję (w singletonie też niby wiemy, ale nie mamy takiej kontroli nad tym).

... i Cysiaczek, mógłbyś trochę bardziej rozjaśnić swoją myśl? bo wydaję mi się, że czytając ten kod mam lekki ocb winksmiley.jpg
Go to the top of the page
+Quote Post
Cysiaczek
post 13.05.2009, 08:45:26
Post #51





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




To jest ilustracja do pytania, które zadaję Tobie w nawiązaniu do:
Cytat
Jak to bywa z obiekatmi kontekstowymi, są one przekazywane w parametrach metod do kolejnych klas, i nawet jak utworzysz nowy obiekt klasy Session, to on i tak będzie pusty a spopulowany danymi obiekt będzie tylko ten który był w parametrze - więc jaki problem? imho, żaden.


Utworzenie wielu instancji klasy Ping w tym konkretnym przypadku skutkuje katastrofą w zupełnie nieoczekiwanym miejscu. Aby temu zapobiec, należy uniemożliwić powołanie więcej niż jednej instancji klasy Ping, a więc skorzystać z wzorca Singleton. To jest przypadek uzasadnionego użycia.

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
LBO
post 13.05.2009, 09:05:04
Post #52





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

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


Cytat(nasty @ 1.05.2009, 21:34:53 ) *
...


Cysiaczku, jak mniemam nie spotkałeś się jeszcze z kontenerami IoC? Są one najlepszym przykładem, że logika odpowiedzialna za powoływanie singletonów powinna być zewnętrzna. Kod jest prostszy, a nasty wskazał dobry przykład gdzie getInstance tylko komplikuje wszystko.
Go to the top of the page
+Quote Post
pejott
post 13.05.2009, 11:00:11
Post #53





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Cały problem w tym, że zaczęto implementować wzorzec singleton w celu udostępnienia jakiegoś obiektu w całej aplikacji.
Ma on swoje konkretne i teoretycznie jedno przeznaczenie, czyli uniemożliwienie stworzenia kilku instancji obiektu.
Wiele osób stosuje go, na przykład przy obiekcie do zarządzania bazą danych, co jest dla mnie bzdurnym rozwiązaniem.
Jest to wręcz nielogiczne, gdyż czasem potrzebujemy wielu połączeń z różnymi bazami.
Ja odciąłem się od singletona w moich projektach i jakoś żyję.

Pozdrawiam.
Go to the top of the page
+Quote Post
nospor
post 13.05.2009, 11:37:11
Post #54





Grupa: Moderatorzy
Postów: 36 430
Pomógł: 6289
Dołączył: 27.12.2004




Cytat
Ja odciąłem się od singletona w moich projektach i jakoś żyję.
Mozna sie odciac od obiektowki i pisac tylko strukturalnie i też mozna jakos zyc winksmiley.jpg

Wszystko zalezy od własciwego wykorzystania i umiejetnosci programisty. Toczy sie równolegle temat o dziedziczeniu i tam dochodzą do podobnych wniosków winksmiley.jpg


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
LBO
post 13.05.2009, 11:45:28
Post #55





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

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


Cytat(pejott @ 13.05.2009, 12:00:11 ) *
Cały problem w tym, że zaczęto implementować wzorzec singleton w celu udostępnienia jakiegoś obiektu w całej aplikacji.
Ma on swoje konkretne i teoretycznie jedno przeznaczenie, czyli uniemożliwienie stworzenia kilku instancji obiektu.
Wiele osób stosuje go, na przykład przy obiekcie do zarządzania bazą danych, co jest dla mnie bzdurnym rozwiązaniem.
Jest to wręcz nielogiczne, gdyż czasem potrzebujemy wielu połączeń z różnymi bazami.
Ja odciąłem się od singletona w moich projektach i jakoś żyję.

Pozdrawiam.


@pejott, umknęło Tobie chyba, że tu nikt nie neguje singletona jako zbędnego wzorca.
To jest raczej wojna o to jak dochodzić do singletona. Jawnie - zaszywając logikę wewnątrz obiektu (np. getInstance()) czy niejawnie - czyli tworzenie obiektow gdzieś w niższej warstwie aplikacji i kontrolowane i ścisłe udostępnianie ich wyżej (loadery, kontenery i kontekst).

Ten post edytował LBO 13.05.2009, 11:46:50
Go to the top of the page
+Quote Post
pejott
post 13.05.2009, 11:55:37
Post #56





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


No tak, to było tylko ogólne spostrzeżenie na temat całego zamieszania wokół tego wzorca.
Teraz każdy początkujący w OOP, który usłyszał negatywną opinię na temat implementacji wzorca, nieświadomie twierdzi, że singleton jest zły.
Co do tej właściwej kwestii, to skłaniałbym się ku temu drugiemu rozwiązaniu, choć nie jestem pewien jak miałoby to wyglądać ?
Sam nie stosuje tego wzorca, ale wydaję mi się, że mam podobnie rozwiązaną kwestie przekazywania i kontrolowania dostępu do obiektów.
Mógłbyś podać przykład jak taki obiekt miałby być "powoływany do życia" i przekazywany dalej ?

Ten post edytował pejott 13.05.2009, 18:02:45
Go to the top of the page
+Quote Post
LBO
post 13.05.2009, 12:37:26
Post #57





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

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


Przygotowałem malutki przykładzik. Mam nadzieję, że pomoże.

  1. <?php
  2. class Container
  3. {
  4.    /**
  5.      * Tablica singletonów.
  6.      *
  7.      * @var array
  8.      */
  9.    public $singletons = array();
  10.  
  11.    /*
  12.      * Tutaj sprawdzam czy kontener ma zwrócić singleton na podstawie jawnego
  13.      * interfejsu.
  14.      * W prawdziwej pełnej implementacji kontener może to robić na podstawie
  15.      * konfigu (np. XML) i/lub adnotacji phpDoc (np. @singleton).
  16.      */
  17.    public function get($classname)
  18.    {
  19.        $reflection = new ReflectionClass($classname);
  20.        if($reflection->implementsInterface('Singleton'))
  21.        {
  22.            if(!array_key_exists($classname, $this->singletons)) {
  23.                $this->singletons[$classname] = new $classname;;
  24.            }
  25.            return $this->singletons[$classname];
  26.        } else {
  27.            return new $classname;
  28.        }
  29.    }
  30. }
  31.  
  32. interface Singleton
  33. {}
  34.  
  35. /*
  36.  * To będzie singleton
  37.  */
  38. class User implements Singleton
  39. {}
  40.  
  41. /*
  42.  * A to nie będzie singletonem :)
  43.  */
  44. class Article
  45. {}
  46.  
  47. $container = new Container();
  48. $user1 = $container->get('User');
  49. $user2 = $container->get('User');
  50. var_dump($user1 === $user2); // true
  51.  
  52. $article1 = $container->get('Article');
  53. $article2 = $container->get('Article');
  54. var_dump($article1 === $article2); // false
  55.  
  56. ?>


edit:

Oczywiście podany przykład jest bardzo abstrakcyjny (w programistycznym sensie słowa). Np we frameworku Agavi ten sposób stosowany jest tylko przy pobieraniu klas modeli (agaviContext::getModel()) reszta obiektów jest za to wstrzykiwana do obiektu kontekstu.

Ten post edytował LBO 13.05.2009, 13:03:23
Go to the top of the page
+Quote Post
pejott
post 13.05.2009, 15:11:45
Post #58





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Dzięki, właśnie tak to sobie wyobrażałem i prawie identycznie mam to rozwiązane u siebie, lecz w trochę innym kontekście/celu.

Pozdrawiam.
Go to the top of the page
+Quote Post
cojack
post 20.05.2009, 09:30:34
Post #59





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

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


Taki mi to singleton ze hoho, po prostu zwykly chory polimorfizm. To tak ja cala hora zabawa z interfejsami. A jak mi ktoś napisze że interfejsy rozwiązują wielodziedziczenie to własnymi rękoma udusze.


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
nospor
post 20.05.2009, 10:43:03
Post #60





Grupa: Moderatorzy
Postów: 36 430
Pomógł: 6289
Dołączył: 27.12.2004




Cytat
A jak mi ktoś napisze że interfejsy rozwiązują wielodziedziczenie to własnymi rękoma udusze
To teraz leć na forum motoryzacyjne i wal z postem

A jak mi ktoś napisze że samochody rozwiązują problem latania to własnymi rękoma udusze

Oczywiste jest, ze interfejsy nie do tego sluzą, tak jak nie sluzą samochody do latania. Nie ma sensu wiec uprzedzac wypowiedzi wiedzących inaczej i walic takie posty winksmiley.jpg


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

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