Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Singleton w praktyce
lukasz91
post
Post #1





Grupa: Zarejestrowani
Postów: 149
Pomógł: 7
Dołączył: 6.01.2010
Skąd: Opole Lubelskie

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


Witam,
właśnie uczę się o wzorcu singleton. W teorii już wiem o co tam chodzi. Byłbym wdzięczny jakby ktoś lakonicznie przedstawił jak używać tego w praktyce smile.gif


--------------------
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Nie używać tego w praktyce.
http://forum.php.pl/index.php?showtopic=122586&hl=
Powód edycji: [wookieb]:


--------------------
Go to the top of the page
+Quote Post
lukasz91
post
Post #3





Grupa: Zarejestrowani
Postów: 149
Pomógł: 7
Dołączył: 6.01.2010
Skąd: Opole Lubelskie

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


hmm w takim może polecicie jakieś materiały o budowaniu aplikacji? smile.gif Chodzi mi o odpowiednie wykorzystywanie wzorców, wydajną budowę itp


--------------------
Go to the top of the page
+Quote Post
michaJlS
post
Post #4





Grupa: Zarejestrowani
Postów: 83
Pomógł: 9
Dołączył: 21.05.2004
Skąd: Glogau/Breslau

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


Całkiem fajne opisy:
http://www.oodesign.com/
Go to the top of the page
+Quote Post
starach
post
Post #5





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

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


Cytat(wookieb @ 25.07.2011, 18:49:50 ) *
Ja tam korzystam z niego razem w połączeniu z kontekstem dzięki czemu nawet mając kilka kontekstów mają one tą samą klasę oczywiście zakładając że tak jak u mnie context jest czymś w rodzaju połączenia wzorca kontenera i fabryki.

W małych projektach w używaniu singletona nie ma nic złego tak na prawdę tylko puryści będą zawsze marudzić i dobrze w końcu do czegoś muszą się przydać. wink.gif

edit>
Może i nie widzę nic złego, ale sam tego nie robię tak na marginesie. tongue.gif

Ten post edytował starach 26.07.2011, 02:06:48
Go to the top of the page
+Quote Post
Rid
post
Post #6





Grupa: Zarejestrowani
Postów: 715
Pomógł: 47
Dołączył: 5.12.2010

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


Context ,nie zawsze jest dobry szczególnie w połączeniu z obiektami serializowanymi.Miałem przebój przez to w jednej z kluczowych u mnie bibliotek.
Go to the top of the page
+Quote Post
wookieb
post
Post #7





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Bo nie serializuje się obiektów z kontekstem. Poza tym możliwość przekazanie obiektu przy deserializacji ISTNIEJE. Ale owe rozwiązanie jest bezsensowne ponieważ oznacza, że nie rozumiesz idei kontekstu.


--------------------
Go to the top of the page
+Quote Post
Rid
post
Post #8





Grupa: Zarejestrowani
Postów: 715
Pomógł: 47
Dołączył: 5.12.2010

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


To trzeba powiedzieć Panom z Microsoftu bo utworzyli bibliotekę w której "odwoływali się" do sesji poprzez Context i nie wzieli pod uwagę ,że ktoś może mieć sesje zapisywane do bazy danych,które jako obiekt z contextem są nieserailizowalne,a sesje z innymi niż podstawowe typy danych jak(int,string) trzeba serializować ,aby zapisać do bazy.Dlatego wole unikać contextów.
Go to the top of the page
+Quote Post
wookieb
post
Post #9





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wartości typu resource (połączenia, curl, uchwyty plików) też nie możesz używać przy serializowaniu. Czy to znaczy, że nie będziesz ich używać bo są głupie? Nie. To po prostu taki zasób, który nie może być w ten sposób przechowywany koniec kropka.
A co do biblioteki to nie wiem jaką masz na myśli, ale jeżeli tak jest jak mówisz to jest po prostu dupna. Zresztą... nigdy nie znajdziesz w PHP idealnej fuzji wielu bibliotek i FW. Po prostu każdy ma swój cyrk, swoje małpy, swoje przyzwyczajenia.


--------------------
Go to the top of the page
+Quote Post
Rid
post
Post #10





Grupa: Zarejestrowani
Postów: 715
Pomógł: 47
Dołączył: 5.12.2010

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


Alternatywa dla context Thread Local Storage,co o tym sądzicie??-ale patrze na wiki i stwierdzam że to jeszcze egzotyka w php.
Go to the top of the page
+Quote Post
dariuszp
post
Post #11





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 9.09.2010

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


Dlaczego ktoś tu mówi że nie należy stosować wzorca Singleton ? Dziecinne podejście. Wzorzec ten jak każdy inny to NARZĘDZIE. Od programisty zależy jak użyje dane narzędzie. Więc jeżeli wie jak je użyć to może je zastosować jeżeli są ku temu powody.

Lakoniczne przedstawienie jak używać tego w praktyce ? Jeżeli z jakiegoś powodu chcesz wymusić na programiście by nie tworzył 2 instancji danego obiektu to Singleton Twoim przyjacielem jest. Jest on zwłaszcza pomocny przy otwartych projektach gdzie nie możesz programistę który coś spieprzył strzelić w potylicę i kazać mu poprawić. Więc jak nie masz potylicy programisty w zasięgu ręki to Singleton Twoim przyjacielem jest.
Go to the top of the page
+Quote Post
wookieb
post
Post #12





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Pisałeś kiedyś testy jednostkowe? Zajmowałeś się prawdziwym projektowaniem większych aplikacji/bibliotek których używa masa programistów (nie koderów, którzy podniecają się wszystkim co oszczędzi im tylko roboty "na tą chwilę")?
Powód edycji: [wookieb]:


--------------------
Go to the top of the page
+Quote Post
Sagnitor
post
Post #13





Grupa: Zarejestrowani
Postów: 34
Pomógł: 3
Dołączył: 29.05.2011

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


Zadam pytanie ciut odbiegające od głównego tematu.

W wielu tematach w internecie przeczytałem o tym jakie to singletony i rejestry są złe. Z natury jestem 'perfekcjonistą' czyli zawsze chcę zaprojektować i napisać swoje aplikacje tak idealnie na ile to jest możliwe ;-). Podczas projektowania swojego frameworka, doszedłem niedawno do systemu logowania błędów, wyjątków, informacji. W tym momencie napotkałem niemały problem. Okazało się, że obiekt 'Loggera' potrzebuję w wielu miejscach aplikacji. Aby napisać to jak najlepiej stwierdziłem, że potrzebuję obiektu dlatego operowanie na klasie statycznej odpada. Tutaj do wyboru są singleton lub przekazywanie mojego obiektu parametrami (tworzenie zależności).

Możecie mnie nakierować jaką techniką się posłużyć w takim problemie?
Go to the top of the page
+Quote Post
by_ikar
post
Post #14





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Cytat(Sagnitor @ 31.08.2011, 13:06:12 ) *
Zadam pytanie ciut odbiegające od głównego tematu.

W wielu tematach w internecie przeczytałem o tym jakie to singletony i rejestry są złe. Z natury jestem 'perfekcjonistą' czyli zawsze chcę zaprojektować i napisać swoje aplikacje tak idealnie na ile to jest możliwe ;-). Podczas projektowania swojego frameworka, doszedłem niedawno do systemu logowania błędów, wyjątków, informacji. W tym momencie napotkałem niemały problem. Okazało się, że obiekt 'Loggera' potrzebuję w wielu miejscach aplikacji. Aby napisać to jak najlepiej stwierdziłem, że potrzebuję obiektu dlatego operowanie na klasie statycznej odpada. Tutaj do wyboru są singleton lub przekazywanie mojego obiektu parametrami (tworzenie zależności).

Możecie mnie nakierować jaką techniką się posłużyć w takim problemie?


Też jakiś czas temu miałem podobny problem. Jak obsłużyć błąd powiedzmy systemu szablonów, jeżeli obiekt systemu szablonów został utworzony po utworzeniu obiektu do obsługi błędów. Wyjść jest conajmniej kilka, o singleton i przekazywaniu parametrów już wspomniałeś, a możesz te obiekty jeszcze zrobić tak, żeby można było je utworzyć bez zależności. Następnie tworzyć te obiekty (logger, response, szablony itp) dopiero w obiekcie obsługującym wyjątki.
Go to the top of the page
+Quote Post
Rid
post
Post #15





Grupa: Zarejestrowani
Postów: 715
Pomógł: 47
Dołączył: 5.12.2010

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


Ja się chyba bardziej zainteresuję wzorcem TLS cap.gif . Kurcze błędnie skrut napisałem,już poprawiłem.

Ten post edytował Rid 31.08.2011, 14:32:48
Go to the top of the page
+Quote Post
Sagnitor
post
Post #16





Grupa: Zarejestrowani
Postów: 34
Pomógł: 3
Dołączył: 29.05.2011

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


Cytat(Rid @ 31.08.2011, 15:06:29 ) *
Ja się chyba bardziej zainteresuję wzorcem TLC cap.gif .


Możesz podać pełną nazwę lub chociaż link do opisu tego wzorca?
Go to the top of the page
+Quote Post
Rid
post
Post #17





Grupa: Zarejestrowani
Postów: 715
Pomógł: 47
Dołączył: 5.12.2010

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


Ja pracuję w C# wzorzec jest dopracowany,w rubym,Javie też,niestety z tego co patrzyłem jak jest w php to chyba mogę stwierdzic,że chyba jest w fazie "eksperymentalnej".Link jest w poprzednim moim poście.
Tutaj więcej o tym wzorcu jakby kogoś interesowało.

Ten post edytował Rid 31.08.2011, 14:35:04
Go to the top of the page
+Quote Post
adbacz
post
Post #18





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

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


Kurcze, tak czytam o tym singletonie ale nijak nie umiem go zastosować w życiu. przeczytałem kilka tematów tutaj na forum, kilka artykułów, temat na wiki oraz przejrzałem kod CodeIgnitera, ale nijak nie chce mi to grać u mnie. Może pokarzę pseudokod i ktos dojrzy błąd, którego ja nie widzę;/

Główny kontroler:
  1. class Main_Controller {
  2.  
  3. private static $oInstance;
  4. public $test = 'test';
  5.  
  6. public function __construct() {
  7. self::$oInstance =& $this;
  8. }
  9.  
  10. public static function &get_instance() {
  11. return self::$oInstance;
  12. }
  13. }


Osobna funkcja, której możliwe jest wywołanie dopiero po wywołaniu głównego kontrolera:
  1. function &get_instance() {
  2. return Main_Controller::get_instance();
  3. }


No i przykład, gdzie wyskakuje mi błąd. W głównej klasie, gdzie wszystko zostaje uruchomione, potrzebne klasy, ustawienia i właściwa klasa, wywołana od URLa. W konstruktorze, po załadowaniu wszystkich plików:
  1. //ciach
  2. /*linia 65*/$FW =& get_instance();
  3. //ciach
  4. /*linia 77*/echo $FW->test; //Test
  5. //ciach


Dostaję taki błąd:
Kod
Trying to get property of non-object in {link do pliku} on line 77
Go to the top of the page
+Quote Post
wookieb
post
Post #19





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




W php 5 te wszystkie & jako wskaźniki referencji nie są już potrzebne
Na 100 nie tworzysz nowej instancji kontrolera przed wywołaniem funkcji get_instance. Poza tym wywołanie konstruktora powinno być zabronione z zewnątrz. Tak więc...
  1. class Main_Controller {
  2.  
  3. private static $oInstance;
  4. public $test = 'test';
  5.  
  6. private function __construct() {
  7. }
  8.  
  9. public static function get_instance() {
  10. if (!self::$oInstance) {
  11. self::$oInstance = new self();
  12. }
  13. return self::$oInstance;
  14. }
  15. }


Teraz obiektu MainController nie tworzysz poprzez
  1. new MainController();

tylko
  1. $controller = MainController::get_instance();



--------------------
Go to the top of the page
+Quote Post
adbacz
post
Post #20





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

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


Mógłbyś mi wytłumaczyć dlaczego powinno się uniemożliwiać dostęp do konstruktora? Pogłowiłem się trochę i faktycznie, przeoczyłem utworzenie instancji głównego kontrolera, przez to konstruktor sie nie uruchamiał (świetny błąd, mój... ;/). Przypatrzałem się i zastosowałem Twój kod, ale nie ma funkcji, ani klasy self(), na pewno jest to dobrze? Nie powinno być czasem self::$oInstance;? Nie znam się a wypadł mi błąd w Twoim kodzie więc się pytam z ciekawości.

Tak nawiasem to mój kod chodzi poprawnie (po paru poprawkach), tylko, że ja instancję obiektu (a raczej zmienną $this) przypisuję do statycznej zmiennej w konstruktorze i chciałbym wiedzieć bardzo dlaczego twierdzisz, albo skąd wiesz, że nie powinno się udostępniać konstruktora z zewnątrz. Teraz mi działa wszystko tak jak powinno, chociaż zdaję sobie sprawę, że może to być moje błędne myślenie - zaczynam dopiero bawić się w pisanie Frameworka i próbuję jakoś zrozumieć działanie CodeIgnitera i przy okazji czegoś się nauczyć.
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 Aktualny czas: 20.08.2025 - 08:28