2011-11-21 134 views
17

問題很簡單:當我創建一個新的API或服務類時,是否應該爲要傳遞的對象創建一個自定義類,或者應該只保留一個僅包含數據的NSDictionary以鍵值風格格式。NSDictionary與自定義對象

顯然有利弊,但你們認爲哪裏是使用其中一個的門檻?

NSDictionary

+無依賴
+非常靈活
+常用
+內建的NSCoding
-結構支持沒有定義 - >運行時錯誤

自定義對象:

+結構定義
+物業式存取:myObject.someProperty -可能導致相對。對於嵌套對象

更新大數量的類:包括言論從jbat100

+1

這取決於你的喜好。例如,我總是有一個業務層邏輯(BLL)並且通常會創建自定義對象。 – beryllium

回答

9

這實際上取決於您期望您的數據模型有多改變。一旦你擁有一個基於自定義類的數據模型,處理更改可能會非常棘手,特別是當你有不同版本的模型(在已經發布的應用程序版本中)的歸檔(NSCoding)時,你必須非常小心以確保向後兼容,避免令人討厭的運行時間驚喜。在這方面,基於NSDictionary的模型,如你所說更靈活。但是,他們不允許定製類執行的所有自定義檢查和行爲。另外,自定義類使數據模型對於不熟悉代碼的編碼人員更加明確,從我的經驗來看,開發人員在處理基於NSDictionary的模型時經常會變得sl((特別是在缺乏經驗的時候),因爲這樣很快就會導致難以理解的混亂,路線,文件,並受到紀律!

+0

感謝您提及關於NSCoding的觀點,我並未意識到這種情況。我將它添加到了專業版和控制檯的列表中 – Besi

11

我通常有一組域模型,這與iPhone開發的MVC方法更適合的。擁有特定的對象也使您能夠更輕鬆地執行類型安全,並且還可以降低長期的複雜性。如果你有NSDictionaries包含NSArrays和更多NSDictionaries等等來表示你的對象圖,它可能很快變得難以管理。

4

如果您需要只讀訪問,不需要方法,你可以做到以下幾點:

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

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

typedef NSDictionary MyClass; 

並使用它:

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

創建類別與創建自定義類有什麼不同? – Godfather