Singleton Design Pattern: pułapki [zamknięte]

zamknięte . To pytanie musi być bardziej skoncentrowane . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Update the question so it edytując ten post.

Zamknięte 3 lata temu .

Popraw to pytanie

Obecnie jestem bardzo zainteresowany tym "wzorcem projektowym". Nie jestem jednak pewien, czy istnieją upadki przy użyciu tej ścisłej globalnej implementacji Państwa. Więc kiedy myślisz, że nie ćwiczyć singleton w aplikacji?

Author: skaffman, 2009-09-19

4 answers

Singleton jest ogólnie złym pomysłem, jeśli robisz testy jednostkowe, i ogólnie złym pomysłem, aby nie robić testów jednostkowych (lub BDD lub testów akceptacyjnych).

Nadanie obiektom stanu globalnego oznacza, że testy jednostkowe, które piszesz z udziałem tych obiektów, zostaną odizolowane i oddzielone od siebie. Zamiast tego będziesz musiał martwić się o zresetowanie stanu dla każdego testu i uwierz mi ... nigdy nie robi się tego w 100%. Jeśli nie zresetujesz stanu globalnego, zaczynasz otrzymywać bardzo dziwne i trudne do debugowania błędy w testach, które tracą czas.

Stan Globalny zwiększa również sprzężenie w kodzie i utrudnia refaktoryzację.

Idealną metodą byłoby użycie kontenera IoC / DI (Spring, Guice itp.) do żądania obiektów. Kontenery te często mają sposoby sprawiania, że obiekty wyglądają jak 'Singletony', ale mają również sposoby modyfikowania tego zachowania w zależności od sytuacji(np. Testowanie jednostek a kod domeny).

To wszystko zależy od rozmiar Twojego problemu oczywiście. Jeśli hakujesz razem 4-klasową platformę testową, aby wypróbować coś, to śmiało użyj Singletona. Jednak, gdy tylko ten projekt nabiera życia i staje się większy i bardziej złożony, a następnie refactor Singleton się.

 38
Author: Jeffrey Cameron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-19 15:14:59

Google Tech Talks miał jakiś czas temu dobrą prezentację na temat globalnego Państwa i singletonów. Statyczny wzorzec Singletona jest zły, ponieważ powoduje niepożądane efekty uboczne i sprawia, że kod jest nie do przetestowania. Static singleton jest wersją oo zmiennych globalnych.

Rozwiązaniem jest utworzenie jednej instancji obiektu i przekazanie jej użytkownikom poprzez iniekcję zależności. Di frameworki, takie jak Guice, ułatwiają definiowanie dobrego rodzaju singletonów (w Guice wystarczy dodać adnotację do klasy za pomocą @ Singleton). Była podobna rozmowa techniczna o nazwie nie szukaj rzeczy! który omówił di więcej.

 19
Author: Esko Luontola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-19 13:34:52

Oprócz kwestii testowania i projektowania wymienionych w innych postach, istnieją problemy z Singletonami i classloaderami. Singletony nie są tak naprawdę "pojedynczymi" na JVM lub aplikację - osiągają to poprzez właściwość statyczną, co naprawdę oznacza, że jest jeden na klasę. Jeśli istnieje wiele classloaderów - jak w większości serwerów aplikacji - każda oddzielna aplikacja otrzymuje nowy classloader, nawet wiele poziomów classloaderów jest używanych w EJB. Instancja Singletona zostaje załadowana na classloader - który w zależności od tego, co robisz z singletonem, może nie przynieść oczekiwanych rezultatów.

 7
Author: Nate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-19 13:15:49

Bardzo rzadko używam Singletona. Ze względu na swój charakter (obiekty statyczne, globalne) są one trudne do wykorzystania w testowaniu jednostkowym kodu. W końcu musisz wykonać synchronizację lub zbudować pewne mechanizmy ponownej inicjalizacji, aby uzyskać świeżą wersję dla każdego testu jednostkowego. Są przypadki, które mają sens-powiedzmy, na przykład globalna Klasa konfiguracji - ale jest ich znacznie mniej, niż ludzie nowi w singletonie wydają się wierzyć. Wiem, że przeszłam przez fazę, w której widziałam zastosowania wzoru Singletona wszędzie. Teraz unikam go, gdzie tylko mogę i cofam go poprzez refaktoryzację w kodzie, gdy natknę się na niepotrzebną implementację.

 3
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-19 11:54:15