2011-11-21 12 views
17

Pytanie jest całkiem proste: kiedy tworzę nowy interfejs API lub klasę usług, czy powinienem utworzyć niestandardową klasę dla obiektów, które są przekazywane, czy też powinienem trzymać się modelu NSDictionary, który po prostu przechowuje dane w formacie stylu klucz-wartość.NSDictionary vs. niestandardowy obiekt

Oczywiście są plusy i minusy, ale jak myślisz, gdzie jest próg używania jednego na drugim?

NSDictionary:

+ Brak zależności
+ bardzo elastyczny
+ Powszechnie stosowane
+ Wbudowane wsparcie dla NSCoding
- struktura nie określono -> Błędy czasu wykonania

Niestandardowy obiektu:

+ Struktura określona
+ Property stylu akcesorów: myObject.someProperty - może spowodować rel. duża liczba klas dla obiektów zagnieżdżonych

Aktualizuj: Wliczone uwagi od jbat100

+1

To zależy od preferencji. Na przykład zawsze mam logikę warstwy biznesowej (BLL) i zwykle tworzę obiekty niestandardowe. – beryllium

Odpowiedz

9

To naprawdę zależy od tego, jak bardzo oczekujesz zmiany modelu danych. Radzenie sobie ze zmianami, gdy masz niestandardowy model danych oparty na klasie, może być trudne, zwłaszcza gdy masz archiwa (pliki NSCoding) z różnymi wersjami modelu (w już dostarczonych wersjach aplikacji), musisz być bardzo ostrożny, aby zapewnić kompatybilność wsteczną i unikaj nieprzyjemnych niespodzianek w czasie pracy. Pod tym względem modele oparte na NSDictionary są, jak pan twierdzi, bardziej elastyczne. Jednak nie pozwalają one na wszystkie niestandardowe kontrole i zachowania wykonywane przez niestandardowe klasy. Również niestandardowe klasy sprawiają, że model danych jest bardziej wyraźny dla programistów nieobeznanych z kodem, z mojego doświadczenia wynika, że ​​programiści często stają się niechlujni (zwłaszcza gdy są niedoświadczeni), kiedy mają do czynienia z modelami opartymi na NSDictionary, co może szybko doprowadzić do niezrozumiałego bałaganu, więc jeśli zejdziesz na dół, trasa, dobrze dokumentuj i bądź zdyscyplinowany!

+0

Dzięki za wzmiankę o punkcie dotyczącym NSCoding, nie zdawałem sobie sprawy z tej sytuacji. Dodałem to do listy pro i con's – Besi

11

zazwyczaj mam zestaw model domeny, które pasują lepiej z podejściem MVC rozwoju iPhone. Posiadanie określonych obiektów pozwala również na łatwiejsze egzekwowanie bezpieczeństwa typu, a także na dłuższą metę zmniejsza złożoność. Jeśli posiadasz NSDictionaries zawierające NSArrays i więcej NSDictionaries etcetera itp. Do reprezentowania twojego obiektu wykres, to może bardzo szybko stać się nie do zarządzania.

4

Jeśli potrzebujesz dostępu tylko do odczytu i nie potrzebują metod, można wykonać następujące czynności:

@interface NSDictionary (MyClassCategory) 
-(NSString*) someField; 
@end 

@implementation NSDictionary (MyClassCategory) 
-(NSString*) someField { 
    return [self objectForKey:@"someField"]; 
} 
@end 

typedef NSDictionary MyClass; 

i używać go:

MyClass* myClass = ...; 
    NSString* value = [myClass someField]; 
+4

Jaki jest sens tworzenia kategorii nad tworzeniem niestandardowej klasy? – Godfather