![]() |
![]() ![]() |
![]() |
![]()
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 ![]() -------------------- |
|
|
![]()
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]:
-------------------- |
|
|
![]()
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?
![]() -------------------- |
|
|
![]()
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/ |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) ![]() ![]() |
Nie używać tego w praktyce. 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.http://forum.php.pl/index.php?showtopic=122586&hl= 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ć. ![]() edit> Może i nie widzę nic złego, ale sam tego nie robię tak na marginesie. ![]() Ten post edytował starach 26.07.2011, 02:06:48 |
|
|
![]()
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.
|
|
|
![]()
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.
-------------------- |
|
|
![]()
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.
|
|
|
![]()
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. -------------------- |
|
|
![]()
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.
|
|
|
![]()
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. |
|
|
![]()
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]:
-------------------- |
|
|
![]()
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? |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław 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? 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. |
|
|
![]()
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
![]() Ten post edytował Rid 31.08.2011, 14:32:48 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 3 Dołączył: 29.05.2011 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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 |
|
|
![]()
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:
Osobna funkcja, której możliwe jest wywołanie dopiero po wywołaniu głównego kontrolera:
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:
Dostaję taki błąd: Kod Trying to get property of non-object in {link do pliku} on line 77
|
|
|
![]()
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...
Teraz obiektu MainController nie tworzysz poprzez
tylko
-------------------- |
|
|
![]()
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ć. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 08:28 |