Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: singleton - co w nim złego ?

odrzucili moje rozwiązanie uzasadniając, miedzy innymi, iż używam starej metodologii stosując wzorzec singleton.

czy singleton jest uważany za przestarzały ?
a jeśli tak - dlaczego i czym go zastąpić ?
Maciej Nowicki

Maciej Nowicki Java Developer

Temat: singleton - co w nim złego ?

Bez informacji czego to było rozwiązanie, w jakim konktekście użyłeś singletonu, itp. itd. nie da się odpowiedzieć na to pytanie.

Singleton sam w sobie na pewno nie jest zły. Złe może być jego zastosowanie.
Jarosław Szczepankiewicz

Jarosław Szczepankiewicz Lead Technical
Consultant

Temat: singleton - co w nim złego ?

Singleton jest uważany generalnie za przestarzały głównie ze względu na utrudnienia w testowaniu aplikacji gdzie utrzymanie kontekstu globalnego w singletonach a nie izolowanego mocno utrudnia / zwiększa koszt testowania automatycznego. Jednym z potencjalnych zastępników jest użycie singletonu na poziomie "logicznym" a nie na wykorzystując statyczny dostęp. Mam na myśli np. bean typu singleton w Springu itp. który bardzo prosto można podmienić w testach / zmienić na mocka Oczywiście można sobie wyobrazić jakieś tematy w których nie można tego dokonać (np. brak DI), wtedy to już jednak trzeba indywidualnie się przyglądać wymaganiom.
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: singleton - co w nim złego ?

były to tak zwane "leniwe" singletony.

w rozwiązaniu trzeba było zasymulować urządzenia zewnętrzne. no więc zamknąłem je w klasach abstrakcyjnych. do testowania (JUnit) utworzyłem podpakiet o nazwie "mock" gdzie urzadzenia zasymulowałem singletonami z publiczną, statyczną metodą getInstance().

konto usunięte

Temat: singleton - co w nim złego ?

mockujesz metody statyczne? ;/
Igor J.:
były to tak zwane "leniwe" singletony.

w rozwiązaniu trzeba było zasymulować urządzenia zewnętrzne. no więc zamknąłem je w klasach abstrakcyjnych. do testowania (JUnit) utworzyłem podpakiet o nazwie "mock" gdzie urzadzenia zasymulowałem singletonami z publiczną, statyczną metodą getInstance().
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: singleton - co w nim złego ?

Łukasz G.:
mockujesz metody statyczne? ;/
broń Boże !

metoda statyczna jest jedna, do uzyskania instancji singletonu.

coś w tym stylu:
SampleSingleton sample = SampleSingleton.getInstance();

a singleton nazywam "leniwym" ponieważ instancja tworzona jest przy pierwszym wywołaniu.

konto usunięte

Temat: singleton - co w nim złego ?

uh, ok, juz sie przerazilem ;}
a jak wspomnieli koledzy - Singleton nie jest w cale przestarzaly, moze ktos nie ogarnal, ze singleton to nie tylko bean springowy ;)Ten post został edytowany przez Autora dnia 05.06.14 o godzinie 13:57
Marcin K.

Marcin K. Java Developer

Temat: singleton - co w nim złego ?

W typowym singletonie instancja zawsze tworzona jest przy pierwszym wywołaniu i tylko wtedy.

Nie wiem czy dobrze rozumiem problem, ale jeśli "trzeba było zasymulować urządzenia zewnętrzne" to dla mnie naturalnym rozwiązaniem jest interfejs i różne jego implementacje - na przykład rzeczywista implementacja urządzeń albo ich symulacja

konto usunięte

Temat: singleton - co w nim złego ?

Albo komuś się nie spodobało i uznał singletona za antywzorzec, co zresztą też podaje Wiki:
http://pl.wikipedia.org/wiki/Singleton_%28wzorzec_proj...

Uzasadnieniem jest łamanie zasad OOP. Z kolei tutaj są jak widać różne implementacje, w tym dla JAVA 5+, thread safe i nie thread safe

https://pl.wikisource.org/wiki/Singleton_%28wzorzec_pro...

ale pewnie nie to było problemem.

Może to jest rozwiązaniem:
http://pl.wikipedia.org/wiki/Strategia_%28wzorzec_proj...
https://pl.wikisource.org/wiki/Strategia_%28wzorzec_pro...
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: singleton - co w nim złego ?

Marcin K.:

Nie wiem czy dobrze rozumiem problem, ale jeśli "trzeba było zasymulować urządzenia zewnętrzne" to dla mnie naturalnym rozwiązaniem jest interfejs i różne jego implementacje - na przykład rzeczywista implementacja urządzeń albo ich symulacja

tu była klasa abstrakcyjna ze szczątkową funkcjonalnością. sigleton był użyty do otrzymania instancji symulującej urządzenie przy JUnit. rozszerzał tą klasę. myślałem też, że można by usyskać inne mock podklasy.

konto usunięte

Temat: singleton - co w nim złego ?

Marcin K.:
W typowym singletonie instancja zawsze tworzona jest przy pierwszym wywołaniu i tylko wtedy.

Stąd singleton można by zastosować chociażby do przetrzymywania jakichś wspólnych zmiennych dla każdego z komponentów aplikacji, które są rzecz jasna trzymane w jednym obiekcie, który ma utworzoną tylko jedną instancję, więc chyba zakres zastosowań powinien być ograniczony.
Nie wiem czy dobrze rozumiem problem, ale jeśli "trzeba było zasymulować urządzenia zewnętrzne" to dla mnie naturalnym rozwiązaniem jest interfejs i różne jego implementacje - na przykład rzeczywista implementacja urządzeń albo ich symulacja

Dobra a co w przypadku gdy jeden z obiektów ma ekstra funkcjonalności, których nie mają inne? To chyba przeczy jednej z zasad SOLID, bo w tym przypadku, jeśli wszystkie mają implementować jeden z góry ustalony interfejs, to te które nie mają tych ekstra funkcjonalności, musiały by mieć puste metody które nic nie robią.

Dobry przykład to chociażby SQLite, vs MySQL czy PostgreSQL. W SQLite nie używa się nazwy użytkownika ani hasła. Jeśli dostęp do tych baz danych ma być przez wspólny interfejs, to SQLite będzie miała metody SetUser, SetPassword, które nic nie robią. A to zdaje się przeczy zasadzie segregacji interfejsów...
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: singleton - co w nim złego ?

tutaj były urządzenia zewnętrzne. na przykład LCD display. klasa abstrakcyjna definiowała jego prostą funkcjonalność.

natomiast do testowania była implementacja,, symulacja. ponieważ przewidywałem tylko jeden taki display - użyłem singletonu. LCD był symulowany na stdout.

podobnie z innymi urządzeniami.

konto usunięte

Temat: singleton - co w nim złego ?

Może te artykuły coś pomogą, zresztą bardzo interesujące bo opisują problem związany z zastosowaniem tego wzorca:

http://4programmers.net/In%C5%BCynieria_oprogramowania...
http://www.pzielinski.com/?p=198
http://aitb.blox.pl/2006/11/Singleton-wzorzec-i-antywz...
http://www.goldenline.pl/grupy/Komputery_Internet/php/...

Artykuł pod pierwszym linkiem może być przynajmniej częściową odpowiedzią. Czyżby singleton był nadużywany w praktyce?

Zresztą nawet tu jest wzmianka:

http://pl.wikipedia.org/wiki/Antywzorzec_projektowy

Singletonizm - niepotrzebne użycie wzorca

konto usunięte

Temat: singleton - co w nim złego ?

Igor J.:
tutaj były urządzenia zewnętrzne. na przykład LCD display. klasa abstrakcyjna definiowała jego prostą funkcjonalność.

natomiast do testowania była implementacja,, symulacja. ponieważ przewidywałem tylko jeden taki display - użyłem singletonu. LCD był symulowany na stdout.

podobnie z innymi urządzeniami.

I w tym chyba był cały problem. Gdyby zapropnowany przez Ciebie model przenieść na świat rzeczywisty, wszyscy współdzielilibyśmy ten sam display LCD itd. Nawet jeśli dotyczyło to testu, w którym pojawia się założenie, że display jest jeden w teście - to nadal nie uzasadnia zamykania implementacji w singletonie.
Koledzy wcześniej już słusznie napisali, że największy problem z singletonami dotyczy ich nie do końca przemyślanego stosowania. Sensownym rozwiązaniem jest zrezygnowanie ze stosowania singletonu na poziomie klasy i ewentualnie dostarczanie zewnętrznego mechanizmu zarządzającego tworzeniem singletonów (np. Spring DI container, ale również najprostsza fabryka tworząca singleton i zwracająca go przy każdym odwołaniu). Ma to ten plus, że w połączeniu z IoC jesteś w stanie zarządzać i w razie potrzeby zmieniać strategię wytwórczą obiektów.
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: singleton - co w nim złego ?

tu singleton pojawiał się jako implementacja klasy abstrakcyjnej tylko na poziomie testów.

model nie zakładał iż w praktycznej realizacji musi być tylko jedna instancja. natomiast do JUnit tak zrobiłem.

konto usunięte

Temat: singleton - co w nim złego ?

Igor J.:
tu singleton pojawiał się jako implementacja klasy abstrakcyjnej tylko na poziomie testów.

model nie zakładał iż w praktycznej realizacji musi być tylko jedna instancja. natomiast do JUnit tak zrobiłem.

Rozumiem dobre intencje, ale proponowałbym rozważyć następujące kwestie:
- jaka jest wartość testów, które de facto posługują się implementacją inną niż ta tzw. produkcyjna?
- jak przetestować współdzielonego pomiędzy różnymi testami singletona, gdy w grę wchodzi m.in. uruchamianie testów wielowątkowo i bez zagwarantowanej kolejności uruchomienia kolejnych przypadków testowych?

Testy jednostkowe mają (a przynajmniej powinny mieć) ogromną wartość dla tworzonego kodu. Stanowią potwierdzenie, że kod który napisaliśmy działa, i dlatego właśnie powinniśmy z reguły posługiwać się implementacjami, które docelowo chcemy widzieć w działaniu w kodzie produkcyjnym.

Spróbuj podejść do tego zadania raz jeszcze, ale tym razem stosując Test-Driven Development. Koncentrując się na przypadkach użycia jeszcze przed napisaniem kodu tzw. produkcyjnego, dostrzeżesz prawdopodobnie zupełnie inny model, w którym próżno będzie szukać śladu singletona :) Trzymam kciuki i chętnie wezmę udział w dyskusji podsumowującej efekty.

konto usunięte

Temat: singleton - co w nim złego ?

Singleton jest o tyle nieciekawy że:
a) w Javie z tego co wiem są problemy z wielowątkowością
b) musisz w obiekcie-kliencie zdefiniować że używa Singletona (przez getInstance)

Pewną propozycją ucieczki od Singletona jest jego wstrzykiwanie:
https://www.ibm.com/developerworks/library/co-single/
(patrz Listing 3)

a najlepszym (w ramach Javy) rozwiązaniem IoC (Spring, CDI, Guice itd).

Czasami stosuje się też wzorce Service Locator:
http://gameprogrammingpatterns.com/service-locator.html

Registry:
http://www.devshed.com/c/a/php/registry-design-pattern/

Context (wstrzykiwany zbiór wymaganych obiektów):
http://accu.org/index.php/journals/246Ten post został edytowany przez Autora dnia 07.06.14 o godzinie 11:26

konto usunięte

Temat: singleton - co w nim złego ?

Piotr L.:
Singleton jest o tyle nieciekawy że:
a) w Javie z tego co wiem są problemy z wielowątkowością
b) musisz w obiekcie-kliencie zdefiniować że używa Singletona (przez getInstance)

Zakładając że:

a) singleton ma zabezpieczenie przed stworzeniem drugiej instancji przez wątek
b) zastosowano mechanizm synchronizacji, więc w danym przedziale czasu tylko jeden z nich ma dostęp do obiektu (sekcje krytyczne, semafory czy coś podobnego)

gdzie tu może być problem? A co z wydajnością?

konto usunięte

Temat: singleton - co w nim złego ?

Tutaj pokazane jest na ile rodzajów zepsutych singletonów można natrafić:
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleChe...

A tu poprawna (od Javy 1.5) wersja - na końcu:
http://pl.wikipedia.org/wiki/Blokada_z_podw%C3%B3jnym_...

Rozwiązanie z enum (brzydkie ale działa):
http://onjavahell.blogspot.com/2009/04/uses-of-singlet...
http://javarevisited.blogspot.com/2012/12/how-to-creat...

Rozwiązanie z leniwą inicjalizacją:
http://www.javajee.com/introduction-to-singleton-patte...Ten post został edytowany przez Autora dnia 07.06.14 o godzinie 15:38

Następna dyskusja:

Co o nim myślicie?




Wyślij zaproszenie do