![]() |
![]() ![]() |
![]() |
![]()
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.
Zamiast pisać:
Mogę używać:
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. |
|
|
![]()
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" ?
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 319 Pomógł: 118 Dołączył: 26.11.2003 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
<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 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 589 Pomógł: 91 Dołączył: 22.05.2008 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 319 Pomógł: 118 Dołączył: 26.11.2003 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
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.
|
|
|
![]()
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 |
|
|
![]()
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 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 319 Pomógł: 118 Dołączył: 26.11.2003 Skąd: Lublin 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. 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?" |
|
|
![]()
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 |
|
|
![]()
Post
#11
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 589 Pomógł: 91 Dołączył: 22.05.2008 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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. |
|
|
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 00:51 |