Singleton Design Pattern: pułapki [zamknięte]
chcesz poprawić to pytanie? Update the question so it edytując ten post.
Zamknięte 3 lata temu .
Popraw to pytanieObecnie 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?
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ę.
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.
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.
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ę.
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