7

मैं इस तरह के डिजाइन विकल्पों में अक्सर चलाता हूं और थोड़ा संघर्ष करता हूं; मैं कुछ अन्य दृष्टिकोणों की तलाश में हूं।"डेटा-केवल" उद्देश्य-सी ऑब्जेक्ट्स के लिए बेहतर विकल्प?

मैं अक्सर की सूची रखने के लिए, या कि मूल रूप से मूल्यों की सिर्फ सेट हैं राज्य का हिस्सा चारों ओर पास करना चाहते हैं। मूल्य आदिम प्रकार होते हैं: फ्लोट्स, एनएसटीइमइंटरवल्स, सीजीपॉइंट्स इत्यादि

मेरी पहली झुकाव अक्सर गुणों के इन सेटों के लिए सी संरचनाएं बनाने के लिए होती है, उदाहरण के लिए

typedef struct _STATE { 
    float foo; 
    NSTimeInterval elapsed; 
    CGPoint point; 
} STATE; 

आदि

लेकिन सी संरचनाओं देशी कोको संग्रह वर्गों (NSArray, NSSet, NSDictionary) के साथ अच्छी तरह से नहीं खेलते हैं, और उनमें से overmany का उपयोग कर बहुत सारे ट्रैक करने के लिए की तरह इसके खिलाफ चलाता है की राज्य का मानना ​​है मेरे कोको-फ्रेंडली कोड के बाकी हिस्सों का अनाज - मैं स्ट्रक्चर के सरणी का प्रबंधन और सीधे प्रबंधन करता हूं, और संदेशों में चारों ओर स्ट्रक्चर पॉइंटर्स पास करता हूं, आदि

दूसरी तरफ, कच्चे प्रदर्शन की आवश्यकता महत्वपूर्ण नहीं है , मैं इन मानों को एनएस डिक्शनरी में एन्कोड कर सकता हूं, उन्हेंमें लपेट सकता हूंया NSNumber, लेकिन जिसके परिणामस्वरूप वाक्य रचना, शायद ही संक्षिप्त, और एक छोटे से कमजोर है दोनों डालने और देखने के लिए कार्यावधि में प्रकार और नाम शुद्धता की आवश्यकता होती है:

[stateDict setObject:[NSNumber numberWithFloat:foo] forKey:@"bar"]; 
... 
float something = [[stateDict objectForKey:@"bar"] floatValue]; 

और कुछ प्रकार, NSTimeInterval की तरह, सिर्फ करने में सक्षम हैं कुछ (बहस योग्य) हैकर (उस मामले में डबल करने के लिए टाइपकास्ट) के साथ प्रयोग किया जाना चाहिए।

अंत में, मैं केवल डेटा-कंटेनर वस्तुओं, निजी सदस्य डेटा और केवल getters/setters के साथ बना सकते हैं। (ये जावा में "सेम" कहा जाता है जाएगा।) इन शब्दकोशों से उपयोग करने के लिए और अधिक संक्षिप्त कर रहे हैं, structs की तुलना में अधिक कोको, लेकिन मेरे लिए overkill की तरह लग रहा है, खासकर अगर मैं केवल "आंतरिक वर्ग" है कि राज्य के प्रबंधन के लिए उपयोग किया जाता है के रूप में उन्हें जरूरत एक ऑब्जेक्ट प्रकार के लिए आंतरिक।

कैसे आप, महान कोको प्रोग्रामिंग सार्वजनिक, इस करते हैं?

उत्तर

14

स्थिति के आधार पर, मैं या तो मनमानी डेटा के लिए NSDictionary कक्षाओं का उपयोग करने के साथ चलाता हूं, या मैं कंटेनर कक्षाएं बनाता हूं (उद्देश्य सी में @ संपत्ति/संश्लेषण टैग यह वास्तव में आसान बनाता है)। हेडर फाइल के लिए ObjC का उपयोग करके:

@interface StateObject : NSObject { 
    NSNumber *foo; 
    NSTimeInterval *elapsed; 
    CGPoint point; 
} 

@property (retain) NSNumber *foo; 
@property (retain) NSTimeInterval *elapsed; 
@property (copy) CGPoint point; 

@end 

एक तो @synthesize <variable> मीटर फ़ाइल में स्वचालित रूप से setters/टिककर खेल बनाने के लिए उपयोग कर सकते हैं। फिर, जबकि गुमनाम NSNumbers अभी भी नटखट हैं, तो आप कर सकते हैं:

myStateObject.foo = [NSNumber numberWithFloat:7.0]; 

इस दर्द के सबसे दूर ले जाना चाहिए, और आप के आसपास बेहतर फेरबदल आंकड़ों के कोको संग्रह वर्गों का उपयोग करते हैं।

+4

+1।मॉडल कक्षाएं बनाना लगभग हमेशा तक जाने का तरीका है जब तक कि आपके पास कुछ बहुत ही महत्वपूर्ण-महत्वपूर्ण कोड न हो, जहां ऑब्जेक्ट्स का उपयोग करने के ऊपरी हिस्से में समस्याएं पैदा होंगी। –

+3

इस मैट के लिए धन्यवाद। इस परिदृश्य में, आपको NSNumber के साथ फ्लोट को लपेटने की भी आवश्यकता नहीं है - कोई भी प्राचीन प्रकारों तक पहुंचने के लिए @property वाक्यविन्यास का उपयोग कर सकता है। (NSTimeInterval के लिए निश्चित रूप से चला जाता है, जो एक typedef'd आदिम फ्लोट होता है।) –

2

इस दृष्टिकोण को "सर्वश्रेष्ठ" के रूप में जरूरी नहीं है, लेकिन आपके प्रस्तावों के बीच एक मध्य ग्राउंड है: जानकारी रखने के लिए सी structs बनाएं, और फिर NSValue ऑब्जेक्ट्स में structs को लपेटें जब आपको उन्हें कोको डेटा संरचनाओं में रखना होगा । आप यूआईकिट को कुछ मामलों में नोटिफिकेशन में CGPoint जैसे structs के साथ ऐसा कर सकते हैं (और मुझे यकीन है कि ऐपकिट भी करता है)।

देखें कि अधिक जानकारी के लिए Number and Value Programming Topics for Cocoa में "मान का उपयोग करना"।

संबंधित मुद्दे