Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SINGLETON]Czy można stosować getInstance() w statycznych metodach?
cyklotrial
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 1
Dołączył: 5.06.2009

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


Hej,

Zastanawiam się czy wykorzystanie metody "getInstance" w metodach statycznych, w klasie która jest Singletonem jest poprawne.
  1. class Singleton{
  2. private static $instance;
  3. private $varOne = 0;
  4. private function __construct(){}
  5.  
  6. static function getInstance(){
  7. if(self::instance==null){
  8. self::instance=new Singleton();
  9. }
  10. return self::instance;
  11. }
  12.  
  13. static function doSomething(){
  14. echo self::getInstance()->varOne;
  15. }
  16. }

Zamiast pisać:
  1. Singleton::getInstance()->doSomething();

Mogę używać:
  1. Singleton::doSomething();


Dlaczego tak? Chciałbym skrócić zapis najczęściej używanych metod, ale mam spore obawy co do tego czy taki zapis nie jest niezgodny z wzorcem.
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




No a Co poza zwróceniem obiektu robi "getInstance" ?
Go to the top of the page
+Quote Post
Daimos
post
Post #3





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


Cytat(scanner @ 14.06.2005, 13:39:37 ) *
<span style="font-weight: bold;">Wszelkie kolejne wersje danego projektu proszę umieszczać w tym samym wątku, zgodnie z zasadą : jeden projekt = jeden wątek.

Pozwoli to zmniejszyć bałagan na forum oraz pokaże rozwój ocenianych projektów w czasie.</span>

Przeczytaj sobie dokładnie (pełno tego w internecie) czym jest singleton w PHP.
Twoje przykładowe getInstance jest potrzebne, jeśli to faktycznie ma być Singleton i ma być stworzona tylko jedna instancja danej klasy. Dobrym przykładem jest np. singleton połączenia z bazą danych. To czy potrzebny Ci singleton, już zależy od Ciebie i aplikacji
Go to the top of the page
+Quote Post
#luq
post
Post #4





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

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


Cytat(Daimos @ 20.06.2011, 20:29:33 ) *
Dobrym przykładem jest np. singleton połączenia z bazą danych.

Kłóciłbym się z tym bardzo...
Go to the top of the page
+Quote Post
Daimos
post
Post #5





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


Cytat(#luq @ 20.06.2011, 21:22:58 ) *
Kłóciłbym się z tym bardzo...

Dlaczego? Może rozwiniesz wypowiedź? Ja uważam, że jest to dobry przykład, aby zrozumieć po części, do czego służy singleton. Wyraźnie widać, że połączenie tworzy się wtedy tylko i wyłącznie raz, a wszelkie kolejne odwołania, korzystają już z otwartego, czyż nie o to chodzi w singletonie?

Ten post edytował Daimos 20.06.2011, 21:03:04
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #6





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


Nie raz są potrzebne dwa połączenia z bazą danych, np. w testach jednostkowych. Nie powinno się używać singletonów, gdyż tworzą one statyczne i głębokie zależności, jeśli kiedyś zajdzie potrzeba przetestowania kodu korzystającego z singletonu, bądź z niego zrezygnowania, to możesz mieć problem. Singleton wg mnie w php ma jedynie dydaktyczną wartość, gdyż najłatwiej na jego przykładzie zrozumieć podstawową ideę wzorców projektowych.
Go to the top of the page
+Quote Post
Daimos
post
Post #7





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


Peter, a ja napisałem gdzieś o tym, że trzeba stosować takie singletony zawsze? Czy w ogóle padł temat o ich stosowaniu? Przeczytaj dokładnie co napisałem, chodziło mi o przykład, przez który można zrozumieć zasadę pisania singletonu. W wielu aplikacjach wymagane jest jedno połączenie - w takich przypadkach, klasa singletonu z połączeniem bazy jest dobrym przykładem, aby przyswoić sobie, do czego i dlaczego tak jest. Przecież wiadomo, że każda aplikacja może wymagać innych rzeczy, jednej wystarczy jedno połączenie, jedna baza, a w innej 20 serwerów i 300 połączeń

Ten post edytował Daimos 20.06.2011, 21:46:13
Go to the top of the page
+Quote Post
#luq
post
Post #8





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

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


Dokładnie chodziło mi o to o czym wspomniał @-=Peter=-.
Nie ważne, że w 99% aplikacji łączysz się z jedną bazą, chodzi o to, że klasa DataBase nie jest Singletonem bo to nie jest byt którego może być albo wcale albo sztuk jeden.

Poza tym zawsze powinno się zostawiać furtkę na łatwą rozbudowę jeśli nie wymaga to wielkich nakładów pracy. Debilny przykład - dodania do tabelki pola insertDate z ustawionym current_time, przypuśćmy, że w momencie pisania nie mam planów żeby wykorzystać to pole, ale za 2 lata będę chciał napisać feature, żeby oznaczać użytkowników po miesiącu rejestracji. Jeśli takiego pola nie stworzyłem na początku to tych danych już nie zdobędę ale pomyślałem i utworzyłem sobie takie pole i mogę to wykonać.

Przykład totalnie nie adekwatny ale pokazuje to co chciałem - każdy powinien myśleć jak w przyszłości można rozbudować aplikacje i tworzyć sobie od razu takie możliwości jeśli nie kosztuje go to za dużo.

Ten post edytował #luq 20.06.2011, 22:10:46
Go to the top of the page
+Quote Post
Daimos
post
Post #9





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

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


Cytat(#luq @ 20.06.2011, 23:09:32 ) *
Dokładnie chodziło mi o to o czym wspomniał @-=Peter=-.
Nie ważne, że w 99% aplikacji łączysz się z jedną bazą, chodzi o to, że klasa DataBase nie jest Singletonem bo to nie jest byt którego może być albo wcale albo sztuk jeden.

Poza tym zawsze powinno się zostawiać furtkę na łatwą rozbudowę jeśli nie wymaga to wielkich nakładów pracy. Debilny przykład - dodania do tabelki pola insertDate z ustawionym current_time, przypuśćmy, że w momencie pisania nie mam planów żeby wykorzystać to pole, ale za 2 lata będę chciał napisać feature, żeby oznaczać użytkowników po miesiącu rejestracji. Jeśli takiego pola nie stworzyłem na początku to tych danych już nie zdobędę ale pomyślałem i utworzyłem sobie takie pole i mogę to wykonać.

Przykład totalnie nie adekwatny ale pokazuje to co chciałem - każdy powinien myśleć jak w przyszłości można rozbudować aplikacje i tworzyć sobie od razu takie możliwości jeśli nie kosztuje go to za dużo.

Więc na to, zacytuje sam siebie z postu wyżej (IMG:style_emoticons/default/wink.gif)
"Peter, a ja napisałem gdzieś o tym, że trzeba stosować takie singletony zawsze? Czy w ogóle padł temat o ich stosowaniu?"
Go to the top of the page
+Quote Post
#luq
post
Post #10





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

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


Nie uważnie przeczytałeś mój post. Napisałem, że NIGDY nie powinno się nadawać sigletona czemuś coś ideowo nie jest singletonem.

Ten post edytował #luq 21.06.2011, 08:45:08
Go to the top of the page
+Quote Post
wookieb
post
Post #11





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




Cytat(#luq @ 21.06.2011, 09:44:47 ) *
Nie uważnie przeczytałeś mój post. Napisałem, że NIGDY nie powinno się nadawać sigletona czemuś coś ideowo nie jest singletonem.

Nie ma takiej rzeczy, która nawet w idei może być singletonem.
Go to the top of the page
+Quote Post
#luq
post
Post #12





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

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


Cytat(wookieb @ 21.06.2011, 10:25:11 ) *
Nie ma takiej rzeczy, która nawet w idei może być singletonem.

Dispacher? Klasa systemu szablonów? ;>
Go to the top of the page
+Quote Post
wookieb
post
Post #13





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




Dispatcher czego?
System szablonów nie musi być. Większa ilość mniejszych lepiej spełnia swoje zadanie.
Powtarzam, że nie ma żadnej potrzeby tworzenia jakichkolwiek singletonów.
Go to the top of the page
+Quote Post
luck
post
Post #14





Grupa: Zarejestrowani
Postów: 317
Pomógł: 58
Dołączył: 6.11.2005

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


Wszystko zależy od kontekstu użycia. Na 100 przypadków pojawi się jeden, w którym singleton za jednym zamachem rozwiąże kilka problemów specyficznych dla danego projektu. Mimo wszystko równie dobrze można iść na łatwiznę i próbować używać "global" - zaoszczędzi dużo czasu (przynajmniej tak się będzie wydawało w momencie pisania), ale chyba każdy się zgodzi, że ma nieporównywalnie więcej wad niż zalet. A przecież singleton to takie ładniejsze opakowanie dla zmiennej globalnej. Nie bez powodu choćby w Javie praktykuje się stosowanie fabryk lub dependency injection, zamiast singletonów właśnie.
Osobiście nie neguję całkowicie używania singletonów - sam je czasem stosuję w PHP, np. do obsługi logowania błędów. Jednak, jak wspomniałem na początku, wszystko zależy od kontekstu.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 00:51