2013-08-23 11 views
5

Firma, dla której pracuję, ma OGROMNĄ klasę (Globals.m), która jest singletonem. Przechowuje on głównie grupę BOOL-ów, które powinny przejść do NSUserDefaults, ale są też wskazówki do takich rzeczy, jak videoplayery należące do różnych kontrolerów viewcontrolera. Jestem dość nowy w rozwoju iOS (a ja jestem niskim stażystą), ale wiem, że w moim wnętrzu ten kod pachnie do nieba. Jak mogę wyjaśnić, dlaczego używanie singletonu do przechowywania wszystkich zmiennych jest złe?Dlaczego stosuje się złe praktyki klasy globalnej (singleton)?

Edytować: Nie mam na myśli singletons są złe, mam na myśli w tym przypadku. Zasadniczo każda znacząca zmienna w aplikacji jest przechowywana w tym jednym wystąpieniu.

+1

Wzór to tylko wzór ... To, co jest naprawdę złe to ślepo powiedzieć, że coś jest złe, tylko dlatego, że myślisz, że jest ... Singletonowie nie są źli, ale możesz oczywiście użyć/stworzyć złe singletony ... To zależy od tego, jak je projektujesz/używasz ... – Macmade

+0

Singleton to wzór ... nie używaj odpowiednio, to jest złe i czuję, że ktoś myśli, że używa singletonu, kiedy naprawdę to nie jest singleton –

+0

Dzięki @JoshCaswell, widziałem to wcześniej , ale nie do końca rozumiem wszystkie jego punkty. Przepraszam za powtórzenie! – Febble

Odpowiedz

3

Wiele obiektów w UIKit to singletony. Obiekt UIApplication jest singletonem. NSUserDefaults ma singleton standardUserDefaults. UIDevice currentDevice zwraca singleton.

To, że jest singletonem, nie oznacza, że ​​jest złe. To, co złe, polega na tym, że zaczynasz przywiązywać funkcjonalność w innych klasach do obiektu singleton, z tym tak głęboko zakorzenionym, że nie możesz łatwo zmienić singletonu lub obiektu.

Używam singleton do przechowywania struktur obiektów innych niż CoreData. Definiuję również niektóre metody pomocnicze do uzyskania katalogu biblioteki, kodowania danych i archiwizacji z kluczami. Mogę więc odwoływać się do obiektu tablicy master, gdziekolwiek go potrzebuję, lub łatwo uzyskać dostęp do metod, które w innym przypadku byłyby po prostu kopiowaniem i wklejaniem.

+0

Więc jeśli wszystkie one używają go do zmiennych, to nie ma żadnej szkody? – Febble

+0

Powiedziałbym, że jeśli bezpośrednio uzyskujesz dostęp i modyfikujesz obiekty swojego singletonu w kodzie kontrolera widoku, zamiast przypisywać te obiekty jako właściwości klasy View Controller, wtedy jest źle. tj. '-viewDidLoad {[[[Singleton shared] array] addObject: newObject]; } 'byłoby złe, w przeciwieństwie do ustawiania właściwości tablicy w kontrolerze widoku i modyfikowania jej. – Justin

0

Globals.m nie brzmi naprawdę jak singlet, a jeśli tak, to wygląda na to, że jest używany tylko do celów konfiguracyjnych? Potem, jak sądzę, plik pełen #defines lub extern zrobiłby to samo. Bez dalszych szczegółów trudno jest przewidzieć, czego szukasz.

+0

Jest skonfigurowany jako singleton i ma wyraźny komentarz, który odnosi się do niego jako singleton. I jest aktywnie wykorzystywany do przechowywania dowolnej zmiennej, która ma dostęp do innych klas, nie tylko do konfiguracji. Oprócz interfejsu użytkownika nie odwołuj się do siebie nawzajem. Wszystko odbywa się za pośrednictwem NSNotificationCenter i tej instancji Globals. Jest bardzo możliwe, że po prostu przeskoczyłem do wniosku, że jest to zła praktyka, jak powiedziałem, nie jestem bardzo doświadczony. – Febble

Powiązane problemy