Monopol to diabeł, a singletony ze stanem nieczytelnym / zmiennym są „prawdziwym” problemem ...
Po przeczytaniu Singletonów są Patologicznymi Kłamcami, jak zasugerowano w odpowiedzi Jasona, natknąłem się na ten mały smakołyk, który stanowi najlepiej przedstawiony przykład tego, jak singletony są często niewłaściwie wykorzystywane.
Globalny jest zły, ponieważ:
- za. Powoduje konflikt przestrzeni nazw
- b. Naraża państwo w nieuzasadniony sposób
Jeśli chodzi o Singletony
- za. Wyraźny sposób ich wywoływania przez OO zapobiega konfliktom, więc wskaż a. nie jest problemem
- b. Singletony bez stanu (jak fabryki) nie stanowią problemu. Singletony ze stanem mogą ponownie należeć do dwóch kategorii, które są niezmienne lub piszą raz i czytają wiele (pliki konfiguracji / właściwości). To nie są złe. Zmienne singletony, które są rodzajem posiadaczy referencji, są tymi, o których mówisz.
W ostatnim oświadczeniu nawiązuje do koncepcji blogu „singletony są kłamcami”.
Jak to się ma do Monopolu?
Aby rozpocząć grę w monopol, najpierw:
- najpierw ustalamy reguły, aby wszyscy byli na tej samej stronie
- wszyscy mają równy start na początku gry
- przedstawiono tylko jeden zestaw reguł, aby uniknąć nieporozumień
- zasady nie mogą się zmieniać w trakcie gry
Dla każdego, kto tak naprawdę nie grał w monopol, standardy te są w najlepszym wypadku idealne. Porażka w monopolu jest trudna do przełknięcia, ponieważ w monopolu chodzi o pieniądze, jeśli przegrasz, musisz uważnie obserwować, jak reszta graczy kończy grę, a straty są zwykle szybkie i miażdżące. W związku z tym reguły zwykle ulegają zmianie w pewnym momencie, aby służyć interesom niektórych graczy kosztem innych.
Więc grasz w monopol z przyjaciółmi Bobem, Joe i Edem. Szybko budujesz swoje imperium i pochłaniasz udział w rynku w tempie wykładniczym. Twoi przeciwnicy słabną i zaczynasz wąchać krew (w przenośni). Twój kumpel Bob wkłada wszystkie swoje pieniądze w blokowanie jak największej liczby nieruchomości o niskiej wartości, ale nie osiąga wysokiego zwrotu z inwestycji w sposób, jakiego oczekiwał. Bob, jako powód pecha, ląduje na Boardwalk i zostaje usunięty z gry.
Teraz gra zmienia się z przyjaznego rzucania kostkami w poważny biznes. Bob został przykładem porażki, a Joe i Ed nie chcą skończyć jak „ten facet”. Będąc wiodącym graczem, nagle stajesz się wrogiem. Joe i Ed zaczynają ćwiczyć transakcje pod stołem, zastrzyki gotówki, niedowartościowane zamiany domów i ogólnie wszystko, co osłabi cię jako gracza, dopóki jeden z nich nie awansuje na szczyt.
Następnie, zamiast wygrania jednego z nich, proces zaczyna się od nowa. Nagle skończony zestaw zasad staje się ruchomym celem, a gra przeradza się w rodzaj interakcji społecznych, które stanowiłyby podstawę każdego wysoko ocenianego reality show od czasu Survivor. Dlaczego, ponieważ zasady się zmieniają i nie ma zgody co do tego, jak / dlaczego / co mają reprezentować, a co ważniejsze, nikt nie podejmuje decyzji. W tym momencie każdy gracz w grze ustanawia własne zasady i nastaje chaos, dopóki dwóch graczy nie będzie zbyt zmęczonych, aby nadążyć za szaradą i powoli się poddać.
Tak więc, jeśli zbiór reguł gry dokładnie reprezentowałby singletona, to zbiór reguł monopolu byłby przykładem nadużycia.
Jak to się ma do programowania?
Oprócz wszystkich oczywistych problemów związanych z bezpieczeństwem wątków i synchronizacją, które występują w mutowalnych singletonach ... Jeśli masz jeden zestaw danych, który może być odczytywany / manipulowany przez wiele różnych źródeł jednocześnie i istnieje przez cały czas wykonywania aplikacji, prawdopodobnie jest to dobry moment, aby cofnąć się i zapytać „czy używam tutaj odpowiedniej struktury danych”.
Osobiście widziałem, jak programiści nadużywają singletonu, używając go jako pewnego rodzaju skręconego sklepu z bazami danych w aplikacji. Pracując bezpośrednio nad kodem, mogę zaświadczyć, że był on powolny (z powodu wszystkich blokad wątków potrzebnych do zapewnienia bezpieczeństwa wątków) i koszmarem do pracy (z powodu nieprzewidywalnej / przerywanej natury błędów synchronizacji) oraz prawie niemożliwe do przetestowania w warunkach „produkcyjnych”. Jasne, można by opracować system wykorzystujący odpytywanie / sygnalizację w celu przezwyciężenia niektórych problemów z wydajnością, ale to nie rozwiązałoby problemów z testowaniem i po co zawracać sobie głowę tym, kiedy „prawdziwa” baza danych może już osiągnąć tę samą funkcjonalność w znacznie bardziej solidnej / sposób skalowalny.
Singleton jest opcją tylko , jeśli potrzebujesz tego, co zapewnia singleton. Wystąpienie obiektu tylko do odczytu dla obiektu. Ta sama reguła powinna również kaskadować do właściwości / elementów obiektu.